求助:如何在SQL中统计resuss行对应的前置NULL数据量
修正后的SQL语句及问题分析
原SQL返回全0的原因很明确:WHERE子句只筛选了flag = 'resuss'的行,这些行的flag字段不可能为NULL,因此sum(case when flag is null then 1 else 0 end)的计算结果必然是0。要实现需求,需要关联同一id的所有相关记录,同时处理两种场景:存在flag='resuss'的id、所有flag均为NULL的id。
修正后的SQL语句
-- 场景1:统计存在flag='resuss'的id,对应m+日期之前的flag为NULL的记录数 SELECT d.opendate, d.`m+`, d.id, COUNT(t.id) AS timeHibernate FROM dataTable d LEFT JOIN dataTable t ON d.id = t.id AND t.`m+` < d.`m+` AND t.flag IS NULL WHERE d.flag = 'resuss' GROUP BY d.opendate, d.`m+`, d.id UNION ALL -- 场景2:统计所有flag均为NULL的id的总记录数 SELECT MIN(opendate) AS opendate, -- 可根据需求调整为MAX或其他逻辑 MIN(`m+`) AS `m+`, -- 可根据需求调整为MAX或其他逻辑 id, COUNT(*) AS timeHibernate FROM dataTable WHERE id NOT IN ( SELECT DISTINCT id FROM dataTable WHERE flag = 'resuss' ) GROUP BY id
关键说明
- 场景1逻辑:通过自连接关联同一id的所有记录,筛选出
m+日期早于当前resuss行m+且flag为NULL的记录,用COUNT统计有效数量。 - 场景2逻辑:先排除存在flag='resuss'的id,对剩余全NULL的id按id分组,统计该id的总记录数。其中
opendate和m+取该id的最小值,可根据实际业务需求调整为最大值或其他规则。 - 语法细节:SQL标识符
m+需要用反引号()包裹避免语法错误;字符串常量使用单引号更符合SQL标准;原SQL中的than是笔误,正确应为then`。
内容的提问来源于stack exchange,提问作者reja eja
相关产品推荐
相关产品推荐

