如何编写SQL查询统计符合条件的ID对应Hour的计数?
解决方案
要实现你需要的统计结果,核心是区分两类ID:一类是包含09:00记录的ID,另一类是仅存在11:00记录的ID。以下是两种可行的SQL写法:
方法一:使用CTE统计ID的时段特征
这种方法先通过公共表表达式(CTE)统计每个ID的时段情况,再基于统计结果筛选计数:
WITH id_hour_summary AS ( SELECT ID, -- 统计该ID拥有的不同时段数量 COUNT(DISTINCT Hour) AS total_unique_hours, -- 标记是否包含09:00时段 MAX(CASE WHEN Hour = '09:00' THEN 1 ELSE 0 END) AS has_09, -- 标记是否包含11:00时段 MAX(CASE WHEN Hour = '11:00' THEN 1 ELSE 0 END) AS has_11 FROM your_table GROUP BY ID ) -- 统计包含09:00的ID数量 SELECT COUNT(ID) AS CNT_ID, '09:00' AS Hour FROM id_hour_summary WHERE has_09 = 1 UNION ALL -- 统计仅包含11:00的ID数量 SELECT COUNT(ID) AS CNT_ID, '11:00' AS Hour FROM id_hour_summary WHERE total_unique_hours = 1 AND has_11 = 1 ORDER BY Hour;
方法二:直接用子查询筛选目标ID
如果你的数据库不支持CTE,可以用子查询实现相同逻辑:
-- 统计所有包含09:00记录的ID数量 SELECT COUNT(DISTINCT ID) AS CNT_ID, '09:00' AS Hour FROM your_table WHERE ID IN (SELECT ID FROM your_table WHERE Hour = '09:00') UNION ALL -- 统计仅存在11:00记录的ID数量 SELECT COUNT(DISTINCT ID) AS CNT_ID, '11:00' AS Hour FROM your_table WHERE ID NOT IN (SELECT ID FROM your_table WHERE Hour != '11:00') ORDER BY Hour;
逻辑说明
- 对于
09:00的计数:只要ID存在09:00记录,无论它是否有其他时段(比如10:00),都被统计在内,对应样例中的ID1、2、3、4,共4个。 - 对于
11:00的计数:仅统计那些只有11:00这一条记录的ID,对应样例中的ID5,共1个。
内容的提问来源于stack exchange,提问作者BiSaM
相关产品推荐
相关产品推荐

