Я хочу подвести итог count
на уровне id
.Для каждой итоговой строки id
мне также нужно поле ARRAY of STRUCTs, которое суммирует данные для каждого из двух атрибутов: a1
и a2
.
Вот как мне удалось это сделать, с4 запроса и 6 SELECT
операторов, но я думаю, что должен быть более упорядоченный способ сделать это.
1) Для каждого из сводок атрибута выполните ARRAY_AGG()
во внешнем запросе послевыполнение SUM()
кажется, что это можно сделать за один шаг, хотя нельзя поместить SUM()
в и ARRAY_AGG()
.
2) Выполнение каждого из резюме, сначала на id
изатем для каждого атрибута и последующего присоединения ко всем этим также кажется, что это должно быть сделано за один шаг.
Обратите внимание, что я ценю удобочитаемость этого запроса.Но я думаю, что здесь должны быть какие-то читабельные «короткие», которые мне не хватает.
WITH data AS
((SELECT "A" as id, 1 as count, "a" as a1, "d" as a2)
UNION ALL (SELECT "A", 2, "a", "e")
UNION ALL (SELECT "A", 3, "b", "d")
UNION ALL (SELECT "A", 4, "a", "d")
UNION ALL (SELECT "B", 2, "a", "e")
UNION ALL (SELECT "B", 3, "b", "e")
UNION ALL (SELECT "B", 4, "a", "d")
),
#Summarize on id
datasummary as (
SELECT
data.id, SUM(data.count) as total
FROM
data
GROUP BY
id),
#Summarize in TWO STEPS for a1. There must be a way to do this in one step?
data2summary as (
SELECT
id, ARRAY_AGG(STRUCT(a1, count)) as a1
FROM
(SELECT
id, a1, SUM(count) as count
FROM
data
GROUP BY
id, a1)
GROUP BY id),
#Summarize in TWO STEPS for a2. There must be a way to do this in one step?
data3summary as (
SELECT
id, ARRAY_AGG(STRUCT(a2, count)) as a2
FROM
(SELECT
id, a2, SUM(count) as count
FROM
data
GROUP BY
id, a2)
GROUP BY
id)
#Join everything in one table
SELECT
t.id, t.total, t2.a1, t3.a2
FROM
datasummary t
LEFT JOIN data2summary t2 ON t.id = t2.id
LEFT JOIN data3summary t3 ON t.id = t3.id```