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

如何从Oracle表中按小时分组查询数据

按日期分组并展示小时数据分布的Oracle查询方案

需求说明

我的查询返回的数据包含created_date字段,该字段是带小时信息的日期类型,代表记录的创建时间。我需要生成按日期分组、同时展示各小时数据分布的结果(类似每天一行,各小时列对应统计数量的表格样式)。

目前我仅能实现按天维度统计的查询:

SELECT TRUNC(CREATED_DATE),COUNT(*) FROM IMAGE_HISTORY
WHERE CREATED_DATE >= SYSDATE-7
GROUP BY TRUNC(CREATED_DATE)
ORDER BY TRUNC(CREATED_DATE) ASC

解决方案

1. 转置为小时列(匹配示例表格样式)

如果需要将小时转为列,每天一行展示各小时的统计数,可以使用Oracle的PIVOT函数:

SELECT *
FROM (
    SELECT 
        TRUNC(CREATED_DATE) AS 统计日期,
        EXTRACT(HOUR FROM CREATED_DATE) AS 小时,
        COUNT(*) AS 记录数
    FROM IMAGE_HISTORY
    WHERE CREATED_DATE >= SYSDATE - 7
    GROUP BY TRUNC(CREATED_DATE), EXTRACT(HOUR FROM CREATED_DATE)
)
PIVOT (
    NVL(SUM(记录数), 0)  -- 无数据时显示0,替换NULL
    FOR 小时 IN (
        0 AS "0点", 1 AS "1点", 2 AS "2点", 3 AS "3点", 4 AS "4点", 5 AS "5点",
        6 AS "6点", 7 AS "7点", 8 AS "8点", 9 AS "9点", 10 AS "10点", 11 AS "11点",
        12 AS "12点", 13 AS "13点", 14 AS "14点", 15 AS "15点", 16 AS "16点", 17 AS "17点",
        18 AS "18点", 19 AS "19点", 20 AS "20点", 21 AS "21点", 22 AS "22点", 23 AS "23点"
    )
)
ORDER BY 统计日期 ASC;

2. 按日期+小时展示行数据

如果不需要转置列,仅需按日期和小时分行展示统计结果,直接使用分组查询即可:

SELECT 
    TRUNC(CREATED_DATE) AS 统计日期,
    EXTRACT(HOUR FROM CREATED_DATE) AS 小时,
    COUNT(*) AS 总记录数
FROM IMAGE_HISTORY
WHERE CREATED_DATE >= SYSDATE - 7
GROUP BY TRUNC(CREATED_DATE), EXTRACT(HOUR FROM CREATED_DATE)
ORDER BY 统计日期 ASC, 小时 ASC;

内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:35:07