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 但有停止条件的主要内容,如果未能解决你的问题,请参考以下文章
Java Mybatis 接收postgreSQL中array_agg的结果
如何优化大表的 Postgresql ARRAY_AGG 查询?
PostgreSql 聚合函数string_agg与array_agg