PostgreSQL array_agg, но с условием остановки - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть таблица с записями о детях, и я хочу получить разделенные запятыми результаты в порядке убывания по месяцам, но с нарушением состояния ребенка в каждом месяце. если статус равен 0 , отправьте его в массив, но если статус равен 1 , не выдвигайте его и не ломайте его там и не проверяйте запись предыдущих месяцев.

Таблица

Children Table

Желаемый выход:

Desired Output

Я пробовал это так, что дает мне все месяцы. но я не знаю, как разбить его на состояние = 1 условие для каждого ребенка

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

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я думаю об этом как:

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;
0 голосов
/ 07 ноября 2018

Я бы использовал условие "не существует", чтобы отфильтровать ненужные записи:

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
...