PostgreSQL array_agg 但有停止条件

Posted

技术标签:

【中文标题】PostgreSQL array_agg 但有停止条件【英文标题】:PostgreSQL array_agg but with stop condition 【发布时间】:2018-11-07 07:17:38 【问题描述】:

我有一个包含孩子记录的表格,我想按月降序获取逗号分隔的结果,但每个月的孩子状态都有一个中断条件。如果状态为 0 将其推送到数组,但如果状态为 1 则不要将其推送并打破它,也不要检查前几个月的记录。

表格

所需的输出:

我已经尝试过这种方式,这给了我几个月的时间。但我不知道如何在 status = 1 条件下为每个孩子打破它

SELECT name, ARRAY_AGG(month ORDER BY month DESC)
FROM children
GROUP BY name

【问题讨论】:

【参考方案1】:

我认为这是:

SELECT name, ARRAY_AGG(month ORDER BY month DESC)
FROM (SELECT c.*,
             MAX(c.month) FILTER (c.status = 1) OVER (PARTITION BY c.name) as last_1_month
      FROM children c
     ) c
WHERE month > last_1_month 
GROUP BY name;

这个逻辑只是获取status = 1 所在的最后一个月,然后选择后面的所有月份。

如果月份实际上是连续的,没有间隔,那么您可以这样做:

SELECT name,
       ARRAY_AGG(month ORDER BY month DESC)[1:MAX(month) - MAX(month) FILTER (c.status = 1)]
FROM children c
GROUP BY name;

【讨论】:

【参考方案2】:

我会使用不存在的条件来过滤掉你不想要的记录:

SELECT   name, ARRAY_AGG(month ORDER BY month DESC)
FROM     children a
WHERE    NOT EXISTS (SELECT *
                     FROM   children b
                     WHERE  a.name = b.name AND b.status = 1 and a.month <= b.month)
GROUP BY name

【讨论】:

以上是关于PostgreSQL array_agg 但有停止条件的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL -- ARRAY_AGG聚合函数

Java Mybatis 接收postgreSQL中array_agg的结果

如何优化大表的 Postgresql ARRAY_AGG 查询?

PostgreSql 聚合函数string_agg与array_agg

如何在 JpaRepository spring boot 中使用 postgresql array_agg 函数?

PostgreSQL 与 array_to_json 的奇怪行为