【问题标题】:SQL to count records per hour and count how many hours that total record count was greater than a valueSQL 计算每小时记录数并计算总记录数大于某个值的小时数
【发布时间】:2017-03-24 14:28:50
【问题描述】:

使用 SQL Server 2014。我有一个带有时间戳的记录列表,我想计算每小时有多少条记录,然后计算每天记录计数超过给定数字的小时数,比如 20。

这是我目前所拥有的:

select count(distinct datepart(hour, convert(datetime, OrderStateDate))) Count_HoursOver,
    datepart(YEAR, convert(datetime, OrderStateDate)) Date_YEAR,
    datepart(month, convert(datetime, OrderStateDate)) Date_MONTH,
    datepart(day, convert(datetime, OrderStateDate)) Date_DAY
from Reporting.dbo.Orders
group by datepart(YEAR, convert(datetime, OrderStateDate)),
    datepart(month, convert(datetime, OrderStateDate)),
    datepart(day, convert(datetime, OrderStateDate))
having count(idscript) >= 20

结果不正确,我无法理解返回的内容和原因。我是否错误地使用了 HAVING?任何建议将不胜感激!

【问题讨论】:

  • 难道你不应该按小时分组,以便计数,而不是计算有多少小时?
  • 我没有按小时分组,因为我想知道多少小时符合我的标准。那么对于每一天,总计数超过限制的小时数是多少?如果我按小时分组,我会得到一个已经结束的小时列表,但不是按天计算的总数。

标签: sql sql-server


【解决方案1】:

你在这里有一个两部分的问题

我想统计每小时有多少条记录

您可以创建一个返回元组 (RecordsPerHour,HOUR,YEAR,MONTH,DAY) 的查询,如下所示:

SELECT 
    count(*) as RecordsPerHour, 
    datepart(hour,convert(datetime,OrderStateDate)) as Date_HOUR, 
    datepart(year,convert(datetime,OrderStateDate)) as Date_YEAR,
    datepart(month,convert(datetime,OrderStateDate)) as Date_MONTH,
    datepart(day,convert(datetime,OrderStateDate)) as Date_DAY
FROM Reporting.dbo.Orders
GROUP BY
    datepart(year,convert(datetime,OrderStateDate)),
    datepart(month,convert(datetime,OrderStateDate)),
    datepart(day,convert(datetime,OrderStateDate)),
    datepart(hour,convert(datetime,OrderStateDate))

然后计算每天记录计数超过给定数字的小时数,比如 20

为此,请在嵌套查询中使用问题第一部分的查询,使用HAVING 子句仅过滤包含至少 20 个订单的时间。

在外部查询中,按 (YEAR,MONTH,DAY) 分组以确定当天至少有 20 个订单的小时数:

SELECT
    count(*) as HoursWithAtLeast20Orders, 
    Date_YEAR,
    Date_MONTH,
    Date_DAY
FROM
    (SELECT 
        datepart(hour,convert(datetime,OrderStateDate)) as Date_HOUR, 
        datepart(year,convert(datetime,OrderStateDate)) as Date_YEAR,
        datepart(month,convert(datetime,OrderStateDate)) as Date_MONTH,
        datepart(day,convert(datetime,OrderStateDate)) as Date_DAY
    FROM Reporting.dbo.Orders
    GROUP BY
        datepart(year,convert(datetime,OrderStateDate)),
        datepart(month,convert(datetime,OrderStateDate)),
        datepart(day,convert(datetime,OrderStateDate)),
        datepart(hour,convert(datetime,OrderStateDate))
    HAVING count(*) >=20) as t
GROUP BY
    Date_YEAR,
    Date_MONTH,
    Date_DAY

【讨论】:

  • 这正是我所需要的,谢谢!我曾经尝试过一个嵌套查询,但是从你上面提供的内容中取出了它。再次感谢!
【解决方案2】:

第一轮到小时,然后轮到一天

SELECT 
   count(*) as [hours with 20+ Orders],
   dateadd(day, datediff(day,'20000101',dt_hour_rounded),'20000101') as dt_day_rounded     
FROM (
   SELECT
      count(*) as OrdersInHour,
      dateadd(hour, datediff(hour,'20000101',OrderStateDate),'20000101') as dt_hour_rounded
   FROM Reporting.dbo.Orders
   GROUP BY dateadd(hour, datediff(hour,'20000101',OrderStateDate),'20000101')
) t
GROUP BY dateadd(day,datediff(day,'20000101',dt_hour_rounded),'20000101')
WHERE OrdersInHour >= 20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多