我们有一张储值卡表:
CardNo TransactionType Amount TransactionDate(datetime2)
(1 for Top-up, 0 for purchasing products)
=========================================================
0001 1 1000.00 20170809(only date is displayed for brevity)
0001 0 200.00 20170810
0001 0 300.00 20170811
0001 1 200.00 20170811
0001 0 200.00 20170812
我们想知道每张卡(客户)每次购买与当时最近一次充值之间的时间。所以预期的结果是:
RowID GapDays
================
1 Null (or 0)
2 1
3 2
4 Null
5 1
为什么 row id 为 3 有 2 天的间隔?
购买发生在充值之前。
日期列的类型为datetime2
,具有“时间”部分(为简洁起见此处省略),数据按此排序。您可以使用任何索引。如有必要,将添加不存在的索引。
我在
TransactionDate
just 中添加了时间部分以获得正确的交易顺序:然后,您可以使用
APPLY
包含所有记录的运算符来获取它 whereTransactionType = 1
。请注意,您必须将子查询返回的行限制为一条记录。dbfiddle在这里
或者,可以使用
Sql server 2012 lag
函数解决相同的问题。它只是为了学习窗口功能以及如何scalar expression
动态这里不讨论性能。