3.4w+
社区成员
比如A表,字段B为日期,字段C为人,字段D为买东西。请问怎么写代码达到下面效果。
第一天A买东西,统计为一次,第二天A又买了,统计为两次。第三天A没有买,统计为0.第四天买了,统计为一次。只要断了就重新计数。
如果楼主考虑每个日期都要有数的话,可以利用master.dbo.spt_values 获得连续的日期,然后left join实现
--测试数据
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
做两层窗口函数:
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