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

如何在MySQL中统计指定列的最长连续NULL值个数

解决MySQL中统计列C最长连续NULL值个数的问题

我来帮你搞定这个需求!你之前的查询思路是对所有NULL值做整体分组计数,但这没法区分连续的NULL序列——而我们需要的是找出其中最长的那一段连续NULL的长度,在你的示例里就是3。

核心思路:用窗口函数给连续NULL分组

要统计连续的序列,关键是给每一段连续的NULL分配一个唯一的分组ID,然后统计每个分组的行数,最后取最大值。这里可以用MySQL的窗口函数SUM() OVER()来实现分组标记:

完整查询语句

SELECT MAX(null_count) AS longest_consecutive_nulls
FROM (
    SELECT 
        null_group_id,
        COUNT(*) AS null_count
    FROM (
        SELECT 
            -- 每遇到非NULL的C,就生成一个新的分组标记,累计求和得到分组ID
            SUM(CASE WHEN C IS NOT NULL THEN 1 ELSE 0 END) OVER (ORDER BY date) AS null_group_id
        FROM your_table_name
        WHERE C IS NULL -- 只筛选NULL的行,减少计算量
    ) AS grouped_nulls
    GROUP BY null_group_id
) AS null_counts;

逐部分解释

  1. 最内层子查询:
    这里用CASE WHEN判断当前行的C是否非NULL,如果是就返回1,否则返回0。然后通过SUM() OVER(ORDER BY date)对这个值做累计求和——每遇到一个非NULL的C,累计值就会加1,这样后面的连续NULL就会被分到同一个分组ID下。比如你的示例中,05/01的C是3(非NULL),所以它之后的NULL分组ID会比之前的大1。

  2. 中间子查询:
    按生成的null_group_id分组,统计每个分组的行数,这个行数就是该段连续NULL的长度。比如你的示例里,前3个连续NULL会被分到同一个组,计数为3;后面2个连续NULL分到另一个组,计数为2。

  3. 最外层查询:
    从所有分组的计数中取最大值,就是我们要的最长连续NULL的个数。

测试你的示例数据

把你的数据代入这个查询,会得到结果3,完全符合预期。

为什么你之前的查询不行?

你之前的语句是按C的值分组,把所有NULL归为一组统计总数,这只能得到列C中所有NULL的数量,而无法区分是否连续——比如你的示例里总共有5个NULL,但最长连续的是3个,所以之前的思路解决不了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:32:27