Функции извлечения Django всегда группируются по дням
У меня DateTimeField
- snap_at
.
Мне нужно GROUP PY
это поле на Day
, Week
, Month
и т.д.
Я пробую
qs
.annotate(month=ExtractMonth('snap_at'))
.values('month')
.annotate(
....
)
.annotate(
....
)
.values(
...
)
)
Но, судя по выводу, Django сделал группировку по Days
.
SQL вывод
SQL - SELECT COUNT(*) FROM (SELECT "wb_stockshistory"."snap_at" AS "col1", EXTRACT('month' FROM "wb_stockshistory"."snap_at" AT TIME ZONE 'UTC') AS "month", COUNT(DISTINCT "wb_stockshistory"."good_id") AS "goods_count", COUNT(DISTINCT "wb_stockshistory"."good_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "goods_sales_count", SUM("wb_stockshistory"."sales") AS "total_sales", COUNT(DISTINCT "wb_good"."brand_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "brands_sales_count", COUNT(DISTINCT "wb_good"."supplier_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "suppliers_sales_count", SUM("wb_stockshistory"."revenue") AS "total_revenue", ROUND(AVG("wb_stockshistory"."price"), 2) AS "avg_price", ROUND(AVG("wb_stockshistory"."rating"), 2) AS "rating", COUNT(DISTINCT "wb_good"."brand_id") AS "brands_count", COUNT(DISTINCT "wb_good"."supplier_id") AS "suppliers_count", ROUND((SUM("wb_stockshistory"."feedbacks") / COUNT(DISTINCT "wb_stockshistory"."good_id")), 2) AS "feedbacks", ROUND((SUM("wb_stockshistory"."revenue") / COUNT(DISTINCT "wb_stockshistory"."good_id") FILTER (WHERE "wb_stockshistory"."sales" > 0)), 2) AS "avg_sales" FROM "wb_stockshistory" INNER JOIN "wb_good" ON ("wb_stockshistory"."good_id" = "wb_good"."id") GROUP BY EXTRACT('month' FROM "wb_stockshistory"."snap_at" AT TIME ZONE 'UTC'), "wb_stockshistory"."snap_at") subquery
SQL - SELECT "wb_stockshistory"."snap_at", EXTRACT('month' FROM "wb_stockshistory"."snap_at" AT TIME ZONE 'UTC') AS "month", COUNT(DISTINCT "wb_stockshistory"."good_id") AS "goods_count", COUNT(DISTINCT "wb_stockshistory"."good_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "goods_sales_count", SUM("wb_stockshistory"."sales") AS "total_sales", COUNT(DISTINCT "wb_good"."brand_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "brands_sales_count", COUNT(DISTINCT "wb_good"."supplier_id") FILTER (WHERE "wb_stockshistory"."sales" > 0) AS "suppliers_sales_count", SUM("wb_stockshistory"."revenue") AS "total_revenue", ROUND(AVG("wb_stockshistory"."price"), 2) AS "avg_price", ROUND(AVG("wb_stockshistory"."rating"), 2) AS "rating", COUNT(DISTINCT "wb_good"."brand_id") AS "brands_count", COUNT(DISTINCT "wb_good"."supplier_id") AS "suppliers_count", ROUND((SUM("wb_stockshistory"."feedbacks") / COUNT(DISTINCT "wb_stockshistory"."good_id")), 2) AS "feedbacks", ROUND((SUM("wb_stockshistory"."revenue") / COUNT(DISTINCT "wb_stockshistory"."good_id") FILTER (WHERE "wb_stockshistory"."sales" > 0)), 2) AS "avg_sales" FROM "wb_stockshistory" INNER JOIN "wb_good" ON ("wb_stockshistory"."good_id" = "wb_good"."id") GROUP BY EXTRACT('month' FROM "wb_stockshistory"."snap_at" AT TIME ZONE 'UTC'), "wb_stockshistory"."snap_at" LIMIT 12