PostgreSQL array_agg但有停止条件

时间:2018-11-07 07:17:39

标签: sql postgresql select gaps-and-islands array-agg

我有一张有孩子记录的表,我想以逗号分隔的结果按月降序排列,但每个月中孩子的状况都有一个破缺的情况。如果状态为 0 ,则将其推入数组,但如果状态为 1 ,则不要将其推入并中断,也不要检查前几个月的记录。

表格

Children Table

所需的输出:

Desired Output

我已经尝试过这种方法,这使我所有的时间都增加了。但我不知道如何在每个孩子的 status = 1 条件下打破它

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

//Create a method which will parse json and return the result in String 
//(I am assuming string as parse response for simplicity)
public Observable<String> parseJson(JsonObject jsonObject) {
    return Observable
        .create(
            e -> {
                //parse json code goes here.
                // Once parsing done pass the details
                e.onNext("Details from parsing json");
                e.onComplete();
            }
        );
}