SQL 自上次下单以来的滞后天数
SQL LAG Days since last order
您好,我正在尝试在 SQL 中创建一个窗口查询,它会显示自每个客户上次下单以来的天数。
它现在显示每个订单之间的天数。
我需要在查询中更改什么才能让它只显示自每个客户上次和上次订单以来的天数?现在,它会针对客户的每个订单显示。
查询:
SELECT klantnr,besteldatum,
DATEDIFF(DAY,LAG(besteldatum) OVER(PARTITION BY klantnr ORDER BY besteldatum),besteldatum) AS DaysSinceLastOrder
FROM bestelling
GROUP BY klantnr,besteldatum;
您可以使用 row_number()
为每个 klantnr
按 besteldatum
对行进行排序,并且 return 使用派生的 table (子查询)的最新两个) 或 common table expression.
派生table版本:
select klantnr, besteldatum, DaysSinceLastOrder
from (
select klantnr, besteldatum
, DaysSinceLastOrder = datediff(day,lag(besteldatum) over (partition by klantnr order by besteldatum),besteldatum)
, rn = row_number() over (partition by klantnr order by besteldatum desc)
from bestelling
group by klantnr, besteldatum
) t
where rn = 1
;with cte as (
select klantnr, besteldatum
, DaysSinceLastOrder = datediff(day,lag(besteldatum) over (partition by klantnr order by besteldatum),besteldatum)
, rn = row_number() over (partition by klantnr order by besteldatum desc)
from bestelling
group by klantnr, besteldatum
)
select klantnr, besteldatum, DaysSinceLastOrder
from cte
where rn = 1
如果您希望每个客户一行,rn = 1
是合适的过滤器。如果您想要 n
最新行数,请使用 rn <
n+1.
您好,我正在尝试在 SQL 中创建一个窗口查询,它会显示自每个客户上次下单以来的天数。
它现在显示每个订单之间的天数。
我需要在查询中更改什么才能让它只显示自每个客户上次和上次订单以来的天数?现在,它会针对客户的每个订单显示。
查询:
SELECT klantnr,besteldatum,
DATEDIFF(DAY,LAG(besteldatum) OVER(PARTITION BY klantnr ORDER BY besteldatum),besteldatum) AS DaysSinceLastOrder
FROM bestelling
GROUP BY klantnr,besteldatum;
您可以使用 row_number()
为每个 klantnr
按 besteldatum
对行进行排序,并且 return 使用派生的 table (子查询)的最新两个) 或 common table expression.
派生table版本:
select klantnr, besteldatum, DaysSinceLastOrder
from (
select klantnr, besteldatum
, DaysSinceLastOrder = datediff(day,lag(besteldatum) over (partition by klantnr order by besteldatum),besteldatum)
, rn = row_number() over (partition by klantnr order by besteldatum desc)
from bestelling
group by klantnr, besteldatum
) t
where rn = 1
;with cte as (
select klantnr, besteldatum
, DaysSinceLastOrder = datediff(day,lag(besteldatum) over (partition by klantnr order by besteldatum),besteldatum)
, rn = row_number() over (partition by klantnr order by besteldatum desc)
from bestelling
group by klantnr, besteldatum
)
select klantnr, besteldatum, DaysSinceLastOrder
from cte
where rn = 1
如果您希望每个客户一行,rn = 1
是合适的过滤器。如果您想要 n
最新行数,请使用 rn <
n+1.