小编典典

在 SQL Server 中对每个段的客户事务进行排名

sql

我有下,其中包含客户的交易详情。

交易日期 客户ID
2022 年 1 月 27 日 1
2022 年 1 月 29 日 1
2022 年 2 月 27 日 1
2022 年 3 月 27 日 1
2022 年 3 月 29 日 1
2022 年 3 月 31 日 1
2022 年 4 月 2 日 1
2022 年 4 月 4 日 1
2022 年 4 月 6 日 1

在此表中,每两天发生的连续交易被视为一个段。例如,1 月 27 日至 1 月 29 日之间的交易被视为第 1 段,而3 月 29 日至 4 月 6 日之间的交易被视为第 2 段。我需要按日期顺序对每个段的交易进行排名。如果默认情况下交易不属于任何段,则排名为 1。预期输出低于。

段排名 交易日期 客户ID
1 2022 年 1 月 27 日 1
2 2022 年 1 月 29 日 1
1 2022 年 2 月 27 日 1
1 2022 年 3 月 27 日 1
2 2022 年 3 月 29 日 1
3 2022 年 3 月 31 日 1
4 2022 年 4 月 2 日 1
5 2022 年 4 月 4 日 1
6 2022 年 4 月 6 日 1

有人可以指导如何在 T-sql 中实现这一点吗?


阅读 121

收藏
2022-07-22

共1个答案

小编典典

使用lag()检查TransDate2 天内的变化并将其组合在一起(作为一个段)。之后使用row_number()生成所需的序列

with 
cte as
(
    select *,
           g = case when datediff(day,
                                  lag(t.TransDate) over (order by t.TransDate),
                                  t.TransDate
                                  ) <= 2
                    then 0
                    else 1
                    end
    from   tbl t
),
cte2 as
(
    select *, grp = sum(g) over (order by TransDate)
    from cte
)
select *, row_number() over (partition by grp order by TransDate)
from   cte2 

db<>小提琴演示

2022-07-22