如何为SQL查询添加CONSECUTIVE条件,统计相同连续值的行
实现连续相同结果的tFK统计需求
我来帮你搞定这个连续相同结果的统计需求!首先明确核心目标:我们要找出连续出现恰好(或至少)@variable次相同结果的tFK,结合你的预期案例,下面用SQL窗口函数来实现这个逻辑。
假设你的数据表结构大致如下(如果字段名不同,替换成你实际的字段即可):
CREATE TABLE your_table ( tFK INT, result VARCHAR(50), -- 存储结果的字段 record_date DATE -- 记录日期,用于排序确定顺序 );
实现步骤与代码
我们可以通过以下几步来添加连续条件:
- 给每个
tFK的记录按日期排序,标记行号; - 对比当前记录与上一条记录的
result,生成连续分组标识; - 按
tFK和分组标识统计连续相同结果的次数; - 筛选出连续次数匹配
@variable的tFK。
完整SQL代码如下:
DECLARE @variable INT = 2; -- 这里可以替换成你需要的数值,比如3 WITH ranked_records AS ( -- 步骤1:按tFK分组,按日期排序,给每条记录标行号 SELECT tFK, result, record_date, ROW_NUMBER() OVER (PARTITION BY tFK ORDER BY record_date) AS row_num FROM your_table ), grouped_consecutive AS ( -- 步骤2:生成连续相同结果的分组ID SELECT tFK, result, -- 当当前result和上一条不同时,分组ID+1 SUM(CASE WHEN result = LAG(result) OVER (PARTITION BY tFK ORDER BY row_num) THEN 0 ELSE 1 END) OVER (PARTITION BY tFK ORDER BY row_num) AS consecutive_group_id FROM ranked_records ), consecutive_counts AS ( -- 步骤3:统计每个tFK分组的连续次数 SELECT tFK, COUNT(*) AS consecutive_times FROM grouped_consecutive GROUP BY tFK, consecutive_group_id ) -- 步骤4:筛选出连续次数等于@variable的tFK SELECT DISTINCT tFK FROM consecutive_counts WHERE consecutive_times = @variable;
逻辑说明
- 窗口函数
LAG():用来获取当前记录的上一条同tFK记录的result,判断是否连续相同; SUM() OVER():生成分组ID,每次结果变化时分组ID递增,这样同一个连续相同结果的记录会被分到同一个组;- 最后通过分组统计每组的记录数,筛选出次数匹配
@variable的tFK,用DISTINCT避免重复输出同一个tFK。
匹配你的预期案例
- 当
@variable = 2时,这段SQL会找出所有有连续2次相同结果的tFK,对应你预期的tFK=2; - 当
@variable = 3时,会找出有连续3次相同结果的tFK,对应你预期的tFK=1。
如果你的需求是“连续至少@variable次”,只需要把最后一行的=改成>=即可。
内容的提问来源于stack exchange,提问作者michal
相关产品推荐
相关产品推荐

