使用 SQL 获取每小时统计信息

Posted

技术标签:

【中文标题】使用 SQL 获取每小时统计信息【英文标题】:Getting Hourly statistics using SQL 【发布时间】:2008-12-22 06:11:06 【问题描述】:

我们有一个表,名称为 'employeeReg' 带有字段

employeeNo | employeeName | Registered_on

这里Registered_on是一个时间戳

我们要求在几天内按小时进行注册。例如。

08 年 1 月 1 日 : 12 - 01 PM : 1592 注册

08 Jan 01 : 01 - 02 PM : 1020 注册

有人可以为此提出一个查询吗?


我们使用 Oracle 10gR2 作为我们的数据库服务器。

【问题讨论】:

【参考方案1】:

这与关于How to get the latest record for each day when there are multiple entries per day 的问题密切相关,但略有不同。 (与很多很多 SQL 问题的共同点 - 最初没有给出表名!

基本技术将是找到一个函数,该函数将格式化不同的 Registered_on 值,以便将特定小时内的所有条目组合在一起。这大概可以通过TO_CHAR() 完成,因为我们正在处理 Oracle(mysql 不支持这个)。

SELECT TO_CHAR(Registered_on, "YYYY-MM-DD HH24") AS TimeSlot,
       COUNT(*) AS Registrations
    FROM EmployeeReg
    GROUP BY 1
    ORDER BY 1;

您可以用 TimeSlot 或 TO_CHAR() 表达式替换“1”条目;但是,出于向后兼容性的原因,这很可能会按照所写的那样工作(但我无法在 Oracle 上为您验证 - 在 IBM Informix Dynamic Server 上使用EXTEND(Registered_on, YEAR TO HOUR) 代替TO_CHAR() 的等效工作正常)。

如果您决定希望在没有条目的几个小时内出现零,那么您将需要创建一个您确实希望报告的所有小时的列表,并且您需要对该列表执行 LEFT OUTER JOIN与此查询的结果。困难的部分是生成正确的列表 - 不同的 DBMS 有不同的方法。

【讨论】:

嗨乔纳森,很抱歉错过了。现在已经给出了表名。 NP:这是一个基于回答大量 SQL 问题的讽刺观察。我已经适当地更新了答案 - 我保留了“共同点”句子,但将其斜体,并添加了“最初”。【参考方案2】:

实现了我想要的 :)

SELECT TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24') AS TimeSlot,
       COUNT(*) AS Registrations
    FROM EmployeeReg a
    Group By TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24');

【讨论】:

以上是关于使用 SQL 获取每小时统计信息的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 获取某个时间段每一天每一个小时的统计数据

SQL 统计 一段时间 按每小时统计 记录的数量

sql 获取特定表的IO统计信息

如何使用 node.js 获取系统统计信息

Atitit sql计划任务与查询优化器--统计信息模块

django-debug-toolbar在获取sql统计信息时破坏管理员