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
相关产品推荐
相关产品推荐

