首页 > 解决方案 > 如何在 PostgreSQL 中过滤和求和整数数组

问题描述

我有一项任务,需要将至少有一次执行的所有topup_val操作的总和精确到 15 欧元。此任务需要在单个语句中解决,无需任何窗口函数或子查询(嵌套)。我仍然是 SQL 的初学者,所以我发现完成这项任务很困难。id_usertopup_valSELECTSELECT

我使用 .topup_val将每个行转换id_user为数组array_agg()。但是,我无法使用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;

标签: sqlarrayspostgresqlaggregate-functions

解决方案


使用HAVING而不是WHERE. i出现在GROUP BY子句之后,是聚合后计算的,所以可以用来过滤聚合后的行。


推荐阅读