Aggregierte Dashboard-Berichtsdaten nach Zeitintervall

Das wäre möglich. Ein einfacherer Ansatz besteht darin, die Abfragen so zu ändern, dass sie eine Zeile pro Kategorie zurückgeben. Das lässt sich erreichen, indem man die abschließende GROUP BY-Klausel um die Kategorie-ID erweitert. Ich habe dies nicht mit allen von mir geposteten Beispielen ausprobiert, aber hier ist eine Änderung der Abfrage “Beitragsanzahl pro Intervall”, die das bewerkstelligt:

--[params]
-- string :query_interval = 7 days
-- date :start_date
-- date :end_date
-- int_list :category_ids = -1
-- boolean :include_subcategories = true

WITH query_periods AS (
  SELECT generate_series(:start_date, :end_date, :query_interval::interval)::date as period_start
),
subcategory_ids AS (
    SELECT id FROM categories
    WHERE parent_category_id IN (:category_ids)
),
sub_subcategory_ids AS (
    SELECT id FROM categories
    WHERE parent_category_id IN (SELECT id FROM subcategory_ids)
)

SELECT
period_start,
t.category_id,
COUNT(p.id)
FROM query_periods qp
JOIN posts p
ON p.created_at::date >= qp.period_start AND p.created_at::date < qp.period_start + interval :query_interval
JOIN topics t
ON t.id = p.topic_id
WHERE t.archetype = 'regular'
AND t.deleted_at IS NULL
AND CASE
    WHEN -1 IN (:category_ids)
        THEN true
    WHEN :include_subcategories = false
        THEN t.category_id IN (:category_ids)
    ELSE t.category_id IN (:category_ids) OR t.category_id IN (SELECT id FROM subcategory_ids) OR t.category_id IN (SELECT id FROM sub_subcategory_ids)
END
AND p.deleted_at IS NULL
AND p.post_type = 1
GROUP BY period_start, t.category_id
ORDER BY period_start

So sehen die Ergebnisse auf meiner Entwicklungsumgebung aus: