如何在PostgreSQL中过滤和求和整数数组



我有一项任务,需要将至少有一个topup_valid_user执行的所有topup_val加起来,精确到15欧元。此任务需要在单个SELECT语句中解决,而不需要任何窗口函数或子查询(嵌套的SELECT(。我还是SQL的初学者,所以我发现很难完成这项任务。

我使用array_agg()将每个id_usertopup_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)

相关内容

  • 没有找到相关文章

最新更新