You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:29:59