2017-10-09 55 views
1

嗨我试图在SQL中创建一个窗口化查询,显示了每个客户自上次订单以来的日子。SQL LAG上次订单以来的天数

enter image description here

现在显示我每个订单之间的天。

我在查询中需要更改哪些内容才能显示自上次和每个客户的上一次订单以来的日期?现在它显示了客户所做的每个订单。

查询:

SELECT klantnr,besteldatum, 
     DATEDIFF(DAY,LAG(besteldatum) OVER(PARTITION BY klantnr ORDER BY besteldatum),besteldatum) AS DaysSinceLastOrder 
FROM bestelling 
GROUP BY klantnr,besteldatum; 
+2

你可以在这里粘贴你的查询而不是屏幕截图吗? – Mureinik

+0

天以来的订单,直到*今天*或其他日期? –

回答

2

可以使用row_number()通过besteldatum每个klantnr对行进行排序,并使用派生表(子查询)或common table expression返回最近2个。

派生表版本:

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 

common table expression版本:

;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。