如何在SQL Server中实现滚动7天窗口内客户首次bug事件筛选?
解决SQL Server中滚动7天窗口内首次Bug记录的筛选问题
嘿,这个需求在SQL Server里完全可以轻松搞定,哪怕客户7天内碰到30次以上的Bug也不在话下!我给你捋清楚思路,再直接上可运行的代码。
核心思路
我们要给每个客户的Bug记录按日期排序,然后筛选出每一段连续7天窗口内的第一条记录——也就是说,当一条Bug记录的日期和该客户上一条被保留的记录日期相差超过7天时,这条就作为新的窗口起始记录被保留,中间的重复Bug都排除。
假设的数据表结构
首先假设你的Bug记录表叫BugEvents,字段如下:
Customer:客户名称/ID[Date]:Bug发生日期(用方括号避免和SQL关键字冲突)ReceiptID:Bug对应的凭证ID
实现代码
我们用递归CTE(公共表表达式)来实现,逻辑清晰且效率可靠:
WITH SortedBugEvents AS ( -- 第一步:给每个客户的Bug记录按日期升序排好序,加上序号 SELECT Customer, [Date], ReceiptID, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY [Date]) AS RowNum FROM BugEvents ), RecursiveFirstBugs AS ( -- 递归起始点:每个客户的第一条Bug记录(肯定是首次) SELECT Customer, [Date], ReceiptID, RowNum FROM SortedBugEvents WHERE RowNum = 1 UNION ALL -- 递归逻辑:找到下一条日期和上一条保留记录相差超过7天的Bug SELECT s.Customer, s.[Date], s.ReceiptID, s.RowNum FROM SortedBugEvents s INNER JOIN RecursiveFirstBugs r ON s.Customer = r.Customer AND s.RowNum = r.RowNum + 1 WHERE DATEDIFF(day, r.[Date], s.[Date]) > 7 ) -- 最终输出需要的字段 SELECT Customer, [Date], ReceiptID FROM RecursiveFirstBugs ORDER BY Customer, [Date];
代码验证(以Jack为例)
针对你提到的Jack的情况:
- 2018-05-07(ReceiptID:223A):是Jack的第一条记录,会被保留
- 2018-05-09的Bug:和上一条保留记录的日期差是2天,小于7天,会被排除
- 2018-08-18的Bug:和上一条保留记录(2018-05-07)的日期差超过7天,会被作为新的首次记录保留
完全符合你的需求!
补充说明
如果你的BugEvents表数据量很大,可以给Customer和[Date]字段建立联合索引,这样排序和递归的效率会更高。另外,这个方法不管7天内有多少条重复Bug,都能精准筛选出每个滚动窗口的首次记录,不用手动处理大量重复数据。
内容的提问来源于stack exchange,提问作者Amar
相关产品推荐
相关产品推荐

