如何统计每月首次出现的唯一Event_Combined事件数?
解决方案
核心是先定位每个事件的首次出现月份,再按月份统计该月首次出现的事件数,同时确保所有存在的月份都被展示(包括无新增事件的月份)。
方法1:CTE+窗口函数(适用于现代数据库)
支持MySQL 8.0+、PostgreSQL、SQL Server等:
WITH FirstEventMonths AS ( -- 找出每个事件的首次出现月份 SELECT Event_Combined, MIN(Royalty_Month) AS First_Appearance_Month FROM Agency GROUP BY Event_Combined ), AllExistingMonths AS ( -- 提取所有存在的月份 SELECT DISTINCT Royalty_Month FROM Agency ) -- 关联统计每个月的新增事件数 SELECT aem.Royalty_Month, COUNT(fem.Event_Combined) AS Total_Events FROM AllExistingMonths aem LEFT JOIN FirstEventMonths fem ON aem.Royalty_Month = fem.First_Appearance_Month GROUP BY aem.Royalty_Month ORDER BY aem.Royalty_Month ASC;
方法2:子查询实现(兼容低版本数据库)
如果数据库不支持CTE,可使用子查询:
SELECT am.Royalty_Month, COUNT(DISTINCT a.Event_Combined) AS Total_Events FROM (SELECT DISTINCT Royalty_Month FROM Agency) am LEFT JOIN Agency a ON am.Royalty_Month = a.Royalty_Month -- 只保留该事件在当前月是首次出现的记录 AND NOT EXISTS ( SELECT 1 FROM Agency a2 WHERE a2.Event_Combined = a.Event_Combined AND a2.Royalty_Month < a.Royalty_Month ) GROUP BY am.Royalty_Month ORDER BY am.Royalty_Month ASC;
逻辑说明
- 定位首次出现月份:通过
MIN(Royalty_Month)或NOT EXISTS子查询,确保每个事件只关联到它第一次出现的月份。 - 保留所有月份:提取表中所有存在的月份,避免无新增事件的月份被过滤,保证结果完整性。
- 左连接统计:通过左连接关联月份和首次事件数据,没有匹配的月份会返回
NULL,COUNT时自动记为0。
内容的提问来源于stack exchange,提问作者thestewartofny
相关产品推荐
相关产品推荐

