【问题标题】:SQL Select total count per day, but group by date and hour (running total per hour)SQL 选择每天的总数,但按日期和小时分组(每小时运行总数)
【发布时间】:2014-11-14 12:24:59
【问题描述】:

我找到了与我想要的 here 类似的东西,但它并没有给出完全正确的输出,而且我有一个愚蠢的时刻试图想出正确的解决方案......

我们有一个 AVS 服务器(实时帐户验证服务,但这无关紧要),我想知道今天(或其他任何一天)每小时发出了多少请求。例如,假设在上午 8 点到 9 点之间发出了 100 个请求,在上午 9 点到 10 点之间发出了 50 个请求。输出应该在 8AM100,在 9AM150,但我下面的查询显示了而是每小时请求一次。

我知道它为什么这样做...它是按小时分组,因此它会向我显示每小时的请求,但这不是我想要的,这是每小时运行的总数。 (所以我可以每天运行它,看看昨天这个时候的请求数量是多少,等等......并得到一个指示这是一个缓慢或快速的一天。)我该怎么做?

DECLARE @CurrentDate DATETIME = '14 nov 2014'

SELECT 
    CAST(DateCreated AS DATE) [Date], 
    DATEPART(hour,DateCreated) [Hour],
    COUNT(ID) [Requests] 
FROM Request 
WHERE 
    DateCreated >= @CurrentDate AND Request.DateCreated < DATEADD(DAY, 1, @CurrentDate)
GROUP BY
    CAST(DateCreated AS DATE),
    DATEPART(hour, DateCreated)
ORDER BY 
    CAST(DateCreated AS DATE)

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    以下应该可以工作

    DECLARE @CurrentDate DATETIME = '13 nov 2014'
    
    SELECT DISTINCT 
        CAST(DateCreated AS DATE) [Date], 
        DATEPART(hour,DateCreated) [Hour],
        COUNT(ID) OVER (ORDER BY DATEPART(hour, DateCreated))
    FROM Request
    WHERE 
        DateCreated >= @CurrentDate AND DateCreated < DATEADD(DAY, 1, @CurrentDate)
    ORDER BY 
        DATEPART(hour, DateCreated)
    

    【讨论】:

    • 不确定这是什么版本的 SQL,但我会接受这个...但是,它仅适用于我将查询更改为使用 rank() 函数。所以它使用“rank() OVER (ORDER BY DATEPART(hour, DateCreated))”
    • 这适用于 SQL Server 2008 R2。
    【解决方案2】:

    感谢您的所有回答。不过,他们都没有完全按照我的意愿行事,所以这是我的最后一个查询,以防它对某人有所帮助。答案的问题,也可能是我的问题,是结果只显示每小时的请求总数,而不是当天的最终总数。我在下面的查询给出了每小时的请求数,以及当天的最终请求数,或者如果是当天,则给出当前总数。

    DECLARE @CurrentDate DATETIME = '17 Nov 2014'
    
    SELECT * FROM ( 
        SELECT DISTINCT 
            CAST(DateCreated AS DATE) [Date],
            CASE
                WHEN LEN(CAST(DATEPART(hour,DateCreated) AS VARCHAR)) = 1 THEN '0' + CAST(DATEPART(hour,DateCreated) AS VARCHAR)
                ELSE CAST(DATEPART(hour,DateCreated) AS VARCHAR)
            END + ':00:00' [Time],
            rank() OVER (ORDER BY DATEPART(hour, DateCreated))[Requests]
        FROM Request
        WHERE 
            DateCreated >= @CurrentDate AND DateCreated < DATEADD(DAY, 1, @CurrentDate)
        UNION   
        SELECT  
            CAST(@CurrentDate AS DATE),
            CONVERT(VARCHAR(8),
                    (SELECT TOP 1 DateCreated FROM Request WHERE DateCreated >= @CurrentDate AND Request.DateCreated < DATEADD(DAY, 1, @CurrentDate) ORDER BY DateCreated DESC),
                    108),
            (SELECT COUNT(*) from Request WHERE DateCreated >= @CurrentDate AND Request.DateCreated < DATEADD(DAY, 1, @CurrentDate))
            ) t
    WHERE t.Requests > 0         
    ORDER BY t.Time
    

    今天运行查询会得到如下输出:

    +------------+----------+----------+
    |    Date    |   Time   | Requests |
    +------------+----------+----------+
    | 2014-11-17 | 07:00:00 |        1 |
    | 2014-11-17 | 08:00:00 |        9 |
    | 2014-11-17 | 09:00:00 |       49 |
    | 2014-11-17 | 10:00:00 |      113 |
    | 2014-11-17 | 11:00:00 |      225 |
    | 2014-11-17 | 12:00:00 |      294 |
    | 2014-11-17 | 13:00:00 |      363 |
    | 2014-11-17 | 13:09:46 |      383 |
    +------------+----------+----------+
    

    【讨论】:

      【解决方案3】:
           --if you use MS SQL Server 2008 R2 or later version (2012/2014) then try this
      
      DECLARE @CurrentDate DATE = CONVERT(DATE, GETDATE() - 1) , --yesterday
          @FinishDate AS DATE = CONVERT(DATE, GETDATE() + 1) --tomorrow
      
      SELECT  DISTINCT
              CONVERT(DATE, DateCreated) AS [Date] ,
              DATEPART(HOUR, DateCreated) AS [Hour] ,
              COUNT(ID) OVER ( PARTITION BY CONVERT(DATE, DateCreated) ORDER BY DATEPART(HOUR,
                                                                    DateCreated) ) AS [Cumulative Count]
      FROM    Request
      WHERE   CONVERT(DATE, DateCreated) BETWEEN @CurrentDate
                                         AND     @FinishDate
      ORDER BY CONVERT(DATE, DateCreated) ,
              DATEPART(HOUR, DateCreated)
      

      【讨论】:

        【解决方案4】:
        DECLARE @CurrentDate DATETIME = '14 nov 2014';
        
        WITH hourValues(hourVal) as (
            select  distinct cast(convert(varchar(14), @CurrentDate, 120) + '00' as datetime)
            from    [Request]
            where   datediff(day, [DateCreated], @CurrentDate) = 0)
        SELECT 
            CAST(DateCreated AS DATE) [Date], 
            hourVal,
            COUNT(case when [DateCreated] < dateadd(hour, 1, hourVal) then 1 else null end) [Requests] 
        FROM Request, hourValues
        WHERE 
            datediff(day, [DateCreated], @CurrentDate) = 0
        GROUP BY
            CAST(DateCreated AS DATE),
            hourVal
        ORDER BY 
            [Date],
            HourVal
        

        【讨论】:

        • 是 Microsoft SQL 服务器吗?消息 102,级别 15,状态 1,第 15 行 ')' 附近的语法不正确。
        • 如果我删除第 15 行的右括号并将 [Requests] 更改为 [Request] 这可行,但并不能完全满足我的需求。它给出了一个日期、小时值和请求,但如果我在昨天的日期运行它,它会给出当天的请求总数。
        • 已编辑以修复错字 - 在第 4 行将 getdate() 替换为 @CurrentDate
        猜你喜欢
        • 1970-01-01
        • 2016-08-27
        • 2016-02-27
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多