Отобразить среднее количество дней между последней и предпоследней транзакцией клиента

Набор данных: Fact_Centre_Txn

Centre_Id Cust_Id Дата_посещения ID транзакции Сумма_транзакции N01 1 2022-03-10 03:51:00.000 5 -298 N01 1 2022-03-24 00:17:00.000 23 97 N01 1 2022-04-11 03:52:00.000 29 -66 N01 1 2022-03-22 13:23:00.000 31 252 N01 1 2022-03-29 22:27:00.000 58 148 N01 1 2022-03-02 15:10:00.000 66 -75 N01 1 2022-03-12 13:17:00.000 71 121 N01 1 2022-03-18 05:01:00.000 80 0 N01 1 2022-03-19 00:59:00.000 149 0 N01 1 2022-03-02 16:19:00.000 180 -407 N02 2 2022-03-05 21:08:00.000 190 241 N02 2 2022-04-11 13:24:00.000 148 -202 N02 2 2022-04-09 02:48:00.000 156 -181 N02 2 2022-02-27 03:53:00.000 78 0 N02 2 2022-04-07 19:44:00.000 75 463 N02 2 2022-04-18 04:46:00.000 87 161 N02 2 2022-03-05 19:04:00.000 143 -109 N02 2 2022-03-27 00:39:00.000 41 369 N02 2 2022-04-03 07:50:00.000 33 0 N02 2 2022-02-05 10:20:00.000 12 -121 N02 2 2022-04-02 16:13:00.000 1 209 N02 3 2022-04-26 06:08:00.000 22 -107 N02 3 2022-04-22 06:08:00.000 22 -107 N02 3 2022-04-13 00:55:00.000 135 -64

...и так далее

Желаемый результат:
Количество дней между последней и предпоследней транзакцией клиента:

Centre_Id Cust_Id Количество дней N01 1 12 N02 2 7 N02 3 4

Что я получил:
Выяснилось, что, возможно, я могу использовать ROW_NUMBER и выбрать Visit_Date с row_num 2 и 3 (PARTITION BY Cust_Id, ORDER BY Visit_Date DESC), соответствующими последней дате и второй дате последней транзакции. Не совсем понимаю, что с этим делать дальше:

SELECT *
FROM (
    SELECT Centre_Id, Cust_Id, Visit_Date
        , ROW_NUMBER() OVER (PARTITION BY Cust_Id ORDER BY Visit_Date DESC) AS row_num
    FROM dbo.Fact_Centre_Txn
) AS n
WHERE n.row_num = 2 OR n.row_num = 3
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте оконную функцию lag во внутреннем запросе. Затем во внешнем запросе используйте функцию datediff. Пример:

SELECT centreid, custid, .., DATEDIFF(DAY, last_visit_date, second_last_date)
FROM (
    SELECT centreid 
        , custid
        , visitdate as last_visit_date
        , LAG(visitdate) OVER (PARTITION BY Cust_Id, ORDER BY Visit_Date DESC) AS second_last_date
        , ROW_NUMBER() OVER (PARTITION BY Cust_Id, ORDER BY Visit_Date DESC) AS latest_record,....
    FROM table_name
) AS inner_query
WHERE latest_record = 1

Другие вопросы по теме

Похожие вопросы

Как запросить фрейм данных Snowpark с помощью SQL из Snowflake?
Как устранить ошибку «Ошибка компиляции SQL: объект SNOWPARK_TEMP_STAGE_FLGVIWVUC уже существует». проблема в снежинке?
Как объединить две или более строк и СУММИРОВАТЬ столбец в ОБНОВЛЕНИИ без первичного ключа?
Левая часть выражения LIKE должна иметь значение varchar (фактически: varbinary). Какая альтернатива преобразованию varbinary в varchar?
Чтобы получить предыдущую запись, которая меньше заданной даты и времени
Выберите строки с тем же кодом товара, но с другим значением в другом столбце
Извлечение и обработка подстроки между различным количеством разделителей в строке переменной длины
Потеря производительности из-за бокового соединения в запросе Postgres
Есть ли способ эффективно поддерживать правила крупномасштабных данных в SQL?
Выберите минимум или максимум в зависимости от того, где существует повторяющееся значение