sql server连续统计次数问题?

xuminjun 2023-03-14 12:39:23

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

 

...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2023-03-15
  • 打赏
  • 举报
回复

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

二月十六 版主 2023-03-15
  • 打赏
  • 举报
回复

img

二月十六 版主 2023-03-15
  • 打赏
  • 举报
回复

--测试数据
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 



xuminjun 2023-05-18
  • 举报
回复
@二月十六 谢谢版主
幸福感奇差 2023-03-14
  • 打赏
  • 举报
回复

img

幸福感奇差 2023-03-14
  • 打赏
  • 举报
回复

做两层窗口函数:

  1. 最内层判断时间连续性,连续标 0,不连续标 1
  2. 对上述标记取 cumsum 作为分组依据
  3. 对 2 中分组做行号
select *, sum(1) over(partition by name, cumsum order by date) rownum
from 
(select *, sum(tag) over(partition by name order by date) cumsum
from
(SELECT *, 
    case when date = lag(date) over(partition by name order by date) + 1
            then 0 else 1 end tag
FROM test) t ) t
```sql
xuminjun 2023-05-18
  • 举报
回复
@幸福感奇差 谢谢大佬

34,623

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧