2008-12-22 43 views
3

每小时的统计数据,我们有一个表,名字'employeeReg'与领域获取使用SQL

employeeNo | employeeName | Registered_on 

这里Registered_on是时间戳。

我们需要一个小时的注册模式,在一段时间内。例如。

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

08年1月1日:01 - 下午2点:1020个注册

是否有人可以建议该查询。


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

回答

4

这与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; 

您可能能够通过时隙来替换“1”的条目,或通过TO_CHAR()表达;但是,出于向后兼容性的原因,这很可能会按照书面形式工作(但我无法在Oracle上验证您的身份 - 在IBM Informix Dynamic Server上使用EXTEND(Registered_on, YEAR TO HOUR)代替TO_CHAR()的等效工作正常)。

如果您随后决定在没有条目的情况下要零几小时出现,那么您将需要创建一个您希望报告的所有小时的列表,并且您需要做一个左外部连接与此查询的结果一起列出。困难的部分是生成正确的列表 - 不同的DBMS有不同的方式。

+0

喜乔纳森,遗憾的缺少。现在给了表名。 – 2008-12-22 06:42:00

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');