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

PostgreSQL:如何统计包含0值的arc_name出现次数

解决arcsight.events表统计包含0次记录的问题

看起来你已经尝试了连接但没得到想要的结果,核心问题是当前的查询只返回了有符合条件记录的arc_agt_id,而那些没有匹配记录(或者匹配记录被WHERE过滤掉)的ID被漏掉了。下面是两种可行的解决方案:

方案1:基于当前表获取所有Agent ID(无独立Agent表时)

如果没有单独存储所有arc_agt_id的表,我们可以先从arcsight.events中提取所有唯一的Agent ID,再左连接到统计结果上:

WITH all_unique_agt_ids AS (
    -- 先获取表中所有存在的arc_agt_id,去重
    SELECT DISTINCT arc_agt_id
    FROM arcsight.events
),
filtered_name_counts AS (
    -- 统计符合条件的arc_name出现次数
    SELECT 
        arc_agt_id,
        COUNT(arc_name) AS name_count
    FROM arcsight.events
    WHERE arc_deviceVendor != 'ArcSight'
    GROUP BY arc_agt_id
)
SELECT 
    a.arc_agt_id,
    -- 用COALESCE把NULL转为0,对应没有匹配记录的情况
    COALESCE(f.name_count, 0) AS "count(arc_name)"
FROM all_unique_agt_ids a
LEFT JOIN filtered_name_counts f 
    ON a.arc_agt_id = f.arc_agt_id;

方案2:基于独立Agent表(推荐,更准确)

如果有专门存储所有有效Agent信息的表(比如arcsight.agents),直接用这个表作为主表左连接统计结果会更准确(避免events表中遗漏某些Agent ID):

SELECT 
    a.arc_agt_id,
    -- 注意这里COUNT(e.arc_name)会自动忽略NULL,没有匹配时返回0
    COUNT(e.arc_name) AS "count(arc_name)"
FROM arcsight.agents a
-- 把过滤条件放在JOIN的ON子句中,而不是WHERE,避免过滤掉左连接后的空记录
LEFT JOIN arcsight.events e 
    ON a.arc_agt_id = e.arc_agt_id
    AND e.arc_deviceVendor != 'ArcSight'
GROUP BY a.arc_agt_id;

关键知识点解释

  • 你之前的查询失败的核心原因:把arc_deviceVendor != 'ArcSight'放在了WHERE子句中,这会过滤掉左连接后所有不符合条件的记录(包括那些没有匹配events的Agent ID),等同于内连接的效果。
  • COALESCE函数:用来将左连接后返回的NULL(没有匹配统计结果的Agent ID)转换为0,满足你显示0次的需求。
  • 独立Agent表的优势:如果某些Agent从未产生过事件,arcsight.events中不会有它们的ID,这时只有从专门的Agent表中获取ID才能得到完整的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:13