PostgreSQL数组_agg但带有停止条件

PostgreSQL数组_agg但带有停止条件,sql,postgresql,select,gaps-and-islands,array-agg,Sql,Postgresql,Select,Gaps And Islands,Array Agg,我有一个表,其中记录了children&我希望按月份降序得到逗号分隔的结果,但每个月都有一个中断条件children的状态。如果状态为0,则将其推送到数组中,但如果状态为1,则不要推送到数组中并将其打破,也不要检查前几个月的记录 桌子 期望输出: 我试过这种方法,这给了我所有的月份。但我不知道如何在每个孩子的状态=1条件下打破它 SELECT name, ARRAY_AGG(month ORDER BY month DESC) FROM children GROUP BY name 我将使用n

我有一个表,其中记录了children&我希望按月份降序得到逗号分隔的结果,但每个月都有一个中断条件children的状态。如果状态为0,则将其推送到数组中,但如果状态为1,则不要推送到数组中并将其打破,也不要检查前几个月的记录

桌子

期望输出:

我试过这种方法,这给了我所有的月份。但我不知道如何在每个孩子的状态=1条件下打破它

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

我将使用not exists条件筛选出您不想要的记录:

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
我认为这是:

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;