#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. Фильтр у меня не сработал, но я стараюсь делать это по-другому с регистром при сравнении даты следующего начала с датой отмены. Спасибо, что подумали