我们有一个表,名称为'employeeReg',其中包含字段
employeeNo | employeeName | Registered_on
这里 Registered_on 是一个时间戳。
我们要求在几天内每小时进行一次注册。例如。
01 Jan 08 : 12 - 01 PM : 1592 registrations
01 Jan 08 : 01 - 02 PM : 1020 registrations
有人可以为此提出查询建议吗。
我们使用 Oracle 10gR2 作为我们的数据库服务器。
最佳答案
这与关于 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()
)。
如果您随后决定要在没有条目的小时内显示零,那么您将需要创建一个列表,列出您确实想要报告的所有小时数,并且您需要对该列表进行左外连接使用此查询的结果。困难的部分是生成正确的列表 - 不同的 DBMS 有不同的方法。
关于sql - 使用 SQL 获取每小时统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/385656/