SQL сравнивает два столбца даты и сохраняет первую строку, где 2-й столбец больше

#python #sql #postgresql

Вопрос:

У меня есть таблица с двумя столбцами дат next_start_date и cancel_date .

идентификатор группы индивидуальный идентификатор cancel_date next_start_date_after_cancel
1 001 2017-11-06 2014-03-26
1 001 2017-11-06 2017-01-09
1 001 2017-11-06 2018-04-16
2 001 2018-06-04 2014-03-26
2 001 2018-06-04 2017-01-09
2 001 2018-06-04 2018-04-16
2 001 2018-08-28 2014-03-26
2 001 2018-08-28 2017-01-09
2 001 2018-08-28 2018-04-16

Желаемый результат: days_customer_came_back является вычисляемым столбцом:

идентификатор группы индивидуальный идентификатор cancel_date next_start_date_after_cancel days_customer_came_back
1 001 2017-11-06 2018-04-16 161
2 001 2018-06-04 нулевой нулевой
2 001 2018-08-28 нулевой нулевой

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

Если существует несколько «next_start_date_after_cancel» по отношению к одному и тому же cancel_date , мы сохраняем только первый минимальный, в то время как другие игнорируются.

Кроме того, если для записи cancel_date if все доступные next_start_date_after_cancel значения находятся перед cancel_date, мы заменим его на null, и разница в днях будет выведена как null

Пожалуйста, помогите…

Ответ №1:

Используйте a FILTER , чтобы исключить cancel_date значение, которое больше, чем next_start_date_after_cancel , получить min() его значение внутри подзапроса или CTE. Наконец, вычтите две даты, чтобы получить разницу в днях:

 WITH j AS (
  SELECT 
    group_id,individual_id,cancel_date,
    min(next_start_date_after_cancel) FILTER (WHERE next_start_date_after_cancel > cancel_date) AS next_start_date_after_cancel
  FROM t GROUP BY 1,2,3)
SELECT 
  group_id,individual_id,cancel_date,next_start_date_after_cancel,
  next_start_date_after_cancel-cancel_date
FROM j;
 

ДЕМОНСТРАЦИЯ: db<>fiddle

Комментарии:

1. Фильтр у меня не сработал, но я стараюсь делать это по-другому с регистром при сравнении даты следующего начала с датой отмены. Спасибо, что подумали