2

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

桌子

儿童表

期望的输出:

期望的输出

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

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

2 回答 2

2

我认为这是:

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;
于 2018-11-07T12:50:47.487 回答
1

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

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
于 2018-11-07T07:21:14.443 回答