我有一个包含儿童记录的表格,我想按月按降序获得逗号分隔的结果,但每个月的儿童状态都有一个中断条件。如果状态为0,则将其推送到数组,但如果状态为1,则不要将其推送并打破它,也不要检查前几个月的记录。
桌子
期望的输出:
我已经尝试过这种方式,这给了我几个月的时间。但我不知道如何在status = 1条件下为每个孩子打破它
SELECT name, ARRAY_AGG(month ORDER BY month DESC)
FROM children
GROUP BY name
我有一个包含儿童记录的表格,我想按月按降序获得逗号分隔的结果,但每个月的儿童状态都有一个中断条件。如果状态为0,则将其推送到数组,但如果状态为1,则不要将其推送并打破它,也不要检查前几个月的记录。
桌子
期望的输出:
我已经尝试过这种方式,这给了我几个月的时间。但我不知道如何在status = 1条件下为每个孩子打破它
SELECT name, ARRAY_AGG(month ORDER BY month DESC)
FROM children
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;
我会使用不存在的条件来过滤掉您不想要的记录:
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