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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:34:57