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

如何在MySQL中查询存在7个连续非零值的记录?

MySQL判断单条记录是否存在连续7个非零列的简洁写法

针对15列(首列为id,其余14列为数值型)的表,无需堆砌大量OR操作,推荐以下两种简洁实现方式:

方法1:列转行+窗口函数统计连续非零段(MySQL 8.0+适用)

通过将列转为行并标记分组,统计连续非零列的长度:

SELECT id
FROM (
    SELECT 
        id,
        col_value,
        -- 用SUM窗口函数给非零段分组:遇到0则分组ID递增,非零则延续上一组
        SUM(CASE WHEN col_value = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY col_idx) AS grp
    FROM (
        -- 将14个数值列逐行展开,col_idx保证列的原始顺序
        SELECT id, 1 AS col_idx, col1 AS col_value FROM your_table
        UNION ALL SELECT id, 2, col2 FROM your_table
        UNION ALL SELECT id, 3, col3 FROM your_table
        UNION ALL SELECT id, 4, col4 FROM your_table
        UNION ALL SELECT id, 5, col5 FROM your_table
        UNION ALL SELECT id, 6, col6 FROM your_table
        UNION ALL SELECT id, 7, col7 FROM your_table
        UNION ALL SELECT id, 8, col8 FROM your_table
        UNION ALL SELECT id, 9, col9 FROM your_table
        UNION ALL SELECT id, 10, col10 FROM your_table
        UNION ALL SELECT id, 11, col11 FROM your_table
        UNION ALL SELECT id, 12, col12 FROM your_table
        UNION ALL SELECT id, 13, col13 FROM your_table
        UNION ALL SELECT id, 14, col14 FROM your_table
    ) AS unpivoted
) AS grouped
WHERE col_value != 0
GROUP BY id, grp
HAVING COUNT(*) >= 7;

逻辑说明:先将每列转为一行并标记顺序,再通过窗口函数划分连续非零的分组,最后统计每个分组的长度,筛选出长度≥7的记录ID。

方法2:用户变量统计连续非零数(MySQL 5.x版本适用)

用自定义变量累计连续非零的次数,遇到0则重置:

SELECT DISTINCT id
FROM (
    SELECT 
        id,
        col_value,
        @cnt := CASE 
            WHEN col_value != 0 THEN @cnt + 1 
            ELSE 0 
        END AS consecutive_non_zero
    FROM (
        -- 同方法1,展开所有数值列
        SELECT id, 1 AS col_idx, col1 FROM your_table UNION ALL
        SELECT id, 2, col2 FROM your_table UNION ALL
        SELECT id, 3, col3 FROM your_table UNION ALL
        SELECT id, 4, col4 FROM your_table UNION ALL
        SELECT id, 5, col5 FROM your_table UNION ALL
        SELECT id, 6, col6 FROM your_table UNION ALL
        SELECT id, 7, col7 FROM your_table UNION ALL
        SELECT id, 8, col8 FROM your_table UNION ALL
        SELECT id, 9, col9 FROM your_table UNION ALL
        SELECT id, 10, col10 FROM your_table UNION ALL
        SELECT id, 11, col11 FROM your_table UNION ALL
        SELECT id, 12, col12 FROM your_table UNION ALL
        SELECT id, 13, col13 FROM your_table UNION ALL
        SELECT id, 14, col14 FROM your_table
    ) AS unpivoted,
    (SELECT @cnt := 0) AS init
    ORDER BY id, col_idx
) AS counted
WHERE consecutive_non_zero >= 7;

逻辑说明:初始化变量@cnt为0,遍历每行时,非零则累加计数,遇0则重置为0,最后筛选出计数≥7的记录ID。

补充:简化版多列判断(仅适用于固定列数场景)

如果不想列转行,也可以通过构造连续7列的非零判断,相比全量OR更规整:

SELECT id
FROM your_table
WHERE 
    -- 检查col1-col7是否全非零
    (col1 !=0 AND col2 !=0 AND col3 !=0 AND col4 !=0 AND col5 !=0 AND col6 !=0 AND col7 !=0)
    OR
    -- 检查col2-col8是否全非零
    (col2 !=0 AND col3 !=0 AND col4 !=0 AND col5 !=0 AND col6 !=0 AND col7 !=0 AND col8 !=0)
    OR
    (col3 !=0 AND col4 !=0 AND col5 !=0 AND col6 !=0 AND col7 !=0 AND col8 !=0 AND col9 !=0)
    OR
    (col4 !=0 AND col5 !=0 AND col6 !=0 AND col7 !=0 AND col8 !=0 AND col9 !=0 AND col10 !=0)
    OR
    (col5 !=0 AND col6 !=0 AND col7 !=0 AND col8 !=0 AND col9 !=0 AND col10 !=0 AND col11 !=0)
    OR
    (col6 !=0 AND col7 !=0 AND col8 !=0 AND col9 !=0 AND col10 !=0 AND col11 !=0 AND col12 !=0)
    OR
    (col7 !=0 AND col8 !=0 AND col9 !=0 AND col10 !=0 AND col11 !=0 AND col12 !=0 AND col13 !=0)
    OR
    (col8 !=0 AND col9 !=0 AND col10 !=0 AND col11 !=0 AND col12 !=0 AND col13 !=0 AND col14 !=0);

此方法需手动写出所有连续7列的组合(共8组),适合列数固定且较少的场景。

内容的提问来源于stack exchange,提问作者light

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:00:11