Функции извлечения 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
Вернуться на верх