PostgreSQL array_agg 但有停止条件
PostgreSQL array_agg but with stop condition
我有 table,记录为 children & 我想按月降序获取逗号分隔的结果,但每个月的状态中断条件为 child .如果状态为 0 将其推送到数组,但如果状态为 1 则不要将其推送并在那里中断并且不检查前几个月记录.
Table
期望输出:
我已经尝试过这种方式,这给了我所有的时间。但我不知道如何在每个 child
的 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 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;
我有 table,记录为 children & 我想按月降序获取逗号分隔的结果,但每个月的状态中断条件为 child .如果状态为 0 将其推送到数组,但如果状态为 1 则不要将其推送并在那里中断并且不检查前几个月记录.
Table
期望输出:
我已经尝试过这种方式,这给了我所有的时间。但我不知道如何在每个 child
的 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 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;