使用 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 获取每小时统计信息的主要内容,如果未能解决你的问题,请参考以下文章