[英]Rank customer Transactions per segments in SQL Server
我有下表,其中包含客户的交易详情。
交易日期 | 客户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 中实现这一点吗?
使用lag()检查TransDate
在 2 天内的变化并将其组合在一起(作为一个段)。 之后使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.