我有一项任务,需要将至少有一个topup_val
的id_user
执行的所有topup_val
加起来,精确到15欧元。此任务需要在单个SELECT
语句中解决,而不需要任何窗口函数或子查询(嵌套的SELECT
(。我还是SQL的初学者,所以我发现很难完成这项任务。
我使用array_agg()
将每个id_user
的topup_val
行转换为数组。但是,我无法使用WHERE
子句筛选数组,因为WHERE
子句是在聚合函数之前执行的。
非常感谢!
表topups
id_user | topup_val
---------+-----------
1 | 10
1 | 15
1 | 5
2 | 10
2 | 10
3 | 15
3 | 15
3 | 10
转换为阵列
id_user | topup_array
---------+------------------
1 | {10, 15, 5}
2 | {10, 10}
3 | {15, 15, 10}
预期结果
id_user | topup_sum
---------+------------
1 | 30
3 | 40
我的PostgreSQL查询
SELECT id_user, array_agg(topup_val) AS array_topup
FROM topups
WHERE 15 = ANY(array_topup)
GROUP BY id_user
ORDER BY id_user;
使用HAVING
而不是WHERE
。I出现在GROUP BY
子句之后,并且是在聚合后计算的,因此它可以用于在聚合后过滤行。
在分组依据和排序依据之间,您可以使用HAVING
:进一步过滤结果集
SELECT id_user,sum(topup_val)
FROM topups
GROUP BY id_user
HAVING array_agg(topup_val) && array[15]
ORDER BY id_user;
演示:db<>fiddle
WITH topups (id_user,topup_val) AS ( VALUES
(1,10),(1,15),(1,5),(2,10),(2,10),(3,15),(3,15),(3,10))
SELECT id_user, sum(topup_val)
FROM topups
GROUP BY id_user
HAVING array_agg(topup_val) && array[15]
ORDER BY id_user;
id_user | sum
---------+-----
1 | 30
3 | 40
(2 rows)