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

使用HAVING子句过滤空值行:分组存在非空值时忽略IDNum空值

按日期分组的聚合报表解决方案

咱们先把需求掰扯清楚:要按CreateDate做分组统计,核心规则是——只要某一天存在至少一个非空的IDNum,就把当天所有IDNum为空的记录全排除;只有当某天所有记录的IDNum都是空的时候,才保留那些空值记录。

实现思路

我用窗口函数来给每个日期打个"标记",先统计每个日期下非空IDNum的总数:

  • 如果这个总数大于0,说明当天有有效ID,只留IDNum IS NOT NULL的记录
  • 如果总数等于0,说明当天全是空ID,就保留所有记录

基础筛选SQL代码

WITH DateIdStatus AS (
    SELECT 
        PersonName,
        IDNum,
        CreateDate,
        -- 统计当前日期下非空IDNum的数量
        COUNT(IDNum) OVER (PARTITION BY CreateDate) AS NonNullIdCount
    FROM YourTableName -- 记得替换成你的实际表名
)
SELECT 
    CreateDate,
    PersonName,
    IDNum
FROM DateIdStatus
WHERE 
    -- 两种合法情况:要么当天有有效ID且当前记录ID非空;要么当天全是空ID,全部保留
    (NonNullIdCount > 0 AND IDNum IS NOT NULL)
    OR NonNullIdCount = 0;

进阶聚合报表(如果需要统计汇总数据)

要是你需要进一步统计每天的人数、有效ID数这类聚合值,可以在上面的基础上再加一层分组:

WITH DateIdStatus AS (
    SELECT 
        PersonName,
        IDNum,
        CreateDate,
        COUNT(IDNum) OVER (PARTITION BY CreateDate) AS NonNullIdCount
    FROM YourTableName
),
FilteredData AS (
    SELECT 
        CreateDate,
        PersonName,
        IDNum
    FROM DateIdStatus
    WHERE 
        (NonNullIdCount > 0 AND IDNum IS NOT NULL)
        OR NonNullIdCount = 0
)
SELECT 
    CreateDate,
    COUNT(DISTINCT PersonName) AS 当日唯一人数,
    COUNT(IDNum) AS 当日有效ID数量
FROM FilteredData
GROUP BY CreateDate
ORDER BY CreateDate;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:36:53