如何使用django queryset获取一个月中每一天的最大值
How to get maximum value of each day in month using django queryset
假设我有 Model
个产品,并且我有 10 万条记录。现在我想通过月份 2022-01-01
并获得过去月份每一天的 maximum
价格。
产品型号
id price date
1. 33.33 2022-01-01
2. 93.33 2022-01-01
3. 64.33 2022-01-02
4. 34.33 2022-01-02
.
.
.
101. 43.33 2022-01-29
102. 74.33 2022-01-30
103. 36.33 2022-01-30
期待结果
93.33
64.33
.
.
.
43.33
74.33
对不起,我无法用更好的方式解释。
注
我只想要查询集。请尽量避免循环。
您可以使用以下查询查询对象并注释每天的最大值:
from django.db.models import Max
Product.objects.filter(
valuta_date__gte="startdate", valuta_date__lt="enddate"
).values("date").order_by("date").annotate(Max("price"))
你可以这样做:
from django.db.models import Max
Product.objects.filter(
my_date__year="2022", my_date__month="01"
).values('my_date').annotate(
max_price=Max("price")
).order_by()
但我建议在处理大型数据集时执行原始查询,因为它们像这样工作得更快:
max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product
WHERE strftime("%Y-%m", my_date) = '{0}' GROUP BY my_date;
""".format(year_month)
products = Product.objects.raw(max_product_query)
for product in products:
# do something with the product
上面的查询是针对 mysql 的 sqlite 和下面的 postgres 使用的:
max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product
WHERE EXTRACT(YEAR_MONTH FROM my_date) = '{0}' GROUP BY my_date';
""".format(year_month)
假设我有 Model
个产品,并且我有 10 万条记录。现在我想通过月份 2022-01-01
并获得过去月份每一天的 maximum
价格。
产品型号
id price date
1. 33.33 2022-01-01
2. 93.33 2022-01-01
3. 64.33 2022-01-02
4. 34.33 2022-01-02
.
.
.
101. 43.33 2022-01-29
102. 74.33 2022-01-30
103. 36.33 2022-01-30
期待结果
93.33
64.33
.
.
.
43.33
74.33
对不起,我无法用更好的方式解释。
注 我只想要查询集。请尽量避免循环。
您可以使用以下查询查询对象并注释每天的最大值:
from django.db.models import Max
Product.objects.filter(
valuta_date__gte="startdate", valuta_date__lt="enddate"
).values("date").order_by("date").annotate(Max("price"))
你可以这样做:
from django.db.models import Max
Product.objects.filter(
my_date__year="2022", my_date__month="01"
).values('my_date').annotate(
max_price=Max("price")
).order_by()
但我建议在处理大型数据集时执行原始查询,因为它们像这样工作得更快:
max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product
WHERE strftime("%Y-%m", my_date) = '{0}' GROUP BY my_date;
""".format(year_month)
products = Product.objects.raw(max_product_query)
for product in products:
# do something with the product
上面的查询是针对 mysql 的 sqlite 和下面的 postgres 使用的:
max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product
WHERE EXTRACT(YEAR_MONTH FROM my_date) = '{0}' GROUP BY my_date';
""".format(year_month)