【问题标题】:SQL LAG Days since last order自上次订单以来的 SQL LAG 天数
【发布时间】:2017-10-09 21:32:21
【问题描述】:

您好,我正在尝试在 SQL 中创建一个窗口查询,以显示每个客户自上次订购以来的天数。

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

我需要在我的查询中进行哪些更改以使其仅显示自每个客户的最后一个订单和上一个订单以来的天数?现在它会针对客户下的每个订单显示它。

查询:

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

【问题讨论】:

  • 能否请您在此处粘贴您的查询而不是屏幕截图?
  • 自上次下单到 今天 或其他日期的天数?

标签: sql-server tsql lag


【解决方案1】:

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

派生表版本:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多