SQLServer连续数据问题

文章介绍了如何使用SQL的开窗函数处理连续数据问题,特别是针对某个用户每天是否购买商品的情况进行统计。通过示例代码展示了如何创建测试数据,以及如何利用窗口函数ROW_NUMBER()结合PARTITIONBY和ORDERBY来计算连续购买的次数。如果需要确保每个日期都有记录,可以通过与日期表进行LEFTJOIN来填充缺失日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天遇到一个帖子的问题,是一个连续数据的问题,具体问题链接

比如A表,字段B为日期,字段C为人,字段D为买东西。请问怎么写代码达到下面效果。第一天A买东西,统计为一次,第二天A又买了,统计为两次。第三天A没有买,统计为0.第四天买了,统计为一次。只要断了就重新计数。

        实现方式主要考虑使用开窗函数,直接上结果:

 
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([B] Date,[C] nvarchar(21),[D] nvarchar(22))
Insert #T
select '2023-03-10',N'A',N'香蕉' union all
select '2023-03-11',N'A',N'香蕉' union all
select '2023-03-12',N'A',N'香蕉' union all
select '2023-03-14',N'A',N'香蕉' union ALL
select '2023-03-15',N'A',N'香蕉' union all
select '2023-03-01',N'B',N'香蕉' union all
select '2023-03-02',N'B',N'香蕉' union all
select '2023-03-15',N'B',N'香蕉'
Go
--测试数据结束
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY C ORDER BY B) AS rn from #T
),cteb AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY C,DAY(B)-rn ORDER BY B)  AS rn1 FROM cte
)
SELECT B,C,cteb.D,rn1 AS 次数 FROM cteb 
 
 
 

 

        考虑每个日期都要有数的话,可以利用master.dbo.spt_values 获得连续的日期,然后left join实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值