【发布时间】:2018-10-01 12:24:59
【问题描述】:
我在 SQL Server 2008 R2 中工作,并且很难收集新客户订单和重复客户订单。
我有这种格式的数据:
OrderID OrderDate Customer OrderAmount
-----------------------------------------------
1 1/1/2017 A $10
2 1/2/2017 B $20
3 1/3/2017 C $30
4 4/1/2017 C $40
5 4/2/2017 D $50
6 4/3/2017 D $60
7 1/6/2018 B $70
这就是我们想要的:
- 新定义为:客户在前几个月没有下过任何订单。
- 重复定义为:客户在前一个月(即使是多年前)下过订单。
这意味着,如果新客户在第一个月下达了多个订单,则这些订单都将被视为“新”客户订单。随后几个月的订单都将被视为“重复”客户订单。
我们希望每年每月获得新订单(计数和总和)和重复订单(计数和总和):
Year Month NewCount NewSum RepeatCount RepeatSum
-----------------------------------------------------------------------------
2017 1 3 (A,B,C) $60 (10+20+30) 0 $0
2017 4 2 (D,D) $110 (50+60) 1 (C) $40 (40)
2018 1 0 $0 1 (B) $70 (70)
(() 括号中的信息不是结果的一部分;只是为了清楚起见将其放在这里)
对于任何一个给定的月份来说,SQL 都很容易编写,但是当一次收集数年的月份时,我不知道该怎么做......
如果有一个月没有任何类型的订单,那么 year:month 的 NULL 或 0 值将是首选。
【问题讨论】:
-
看看窗口函数和
LEAD()和LAG()。 -
据我所知,Lead 和 Lag 在 2008R2 上不可用。
-
@BillyTurtleneck 你说得对,它们不可用。但是您是否知道 Sql Server 2008 R2 的最终生命周期只有一年左右?在 2019 年 7 月 9 日之后,将不会为该版本的 Sql Server 创建新的补丁......甚至没有关键的安全补丁。是时候为更新的版本启动迁移项目了。
-
这很好。但是,不使用 Lead/Lag 尝试这样做是徒劳的,还是有办法做到这一点?目前我在我的网络应用程序代码中使用循环,它很慢。如果我能以我需要的方式从 SQL 中获取所有信息,那将是非常棒的一次查询。
标签: sql join sql-server-2008-r2 datepart