Набор данных: Fact_Centre_Txn
...и так далее
Желаемый результат:
Количество дней между последней и предпоследней транзакцией клиента:
Что я получил:
Выяснилось, что, возможно, я могу использовать 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
Используйте оконную функцию 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