2014-11-14 64 views
0

我發現了類似於我想要的東西here,但它沒有給出完全正確的輸出,而且我正在一個愚蠢的時刻,試圖想出正確的解決方案...SQL選擇每天總計數,但按日期和小時分組(每小時運行總計)

我們有一個AVS服務器(實時帳戶驗證服務,但這是無關緊要的),我想知道有多少請求今天(或任何其他日子),在每個小時。例如,假設在上午8點到9點之間發出了100個請求,並且在9點到10點之間發出了50個請求。輸出應該有在8AM,和在9AM,但低於我的查詢被顯示的請求的數量在每一個小時來代替。

我可以看到它爲什麼這樣做...它通過小時分組,因此它顯示我在每個小時的要求,但是這不是我想要的東西,這是每小時一個運行總計。 (所以我可以每天運行它,看看請求的數量看起來像昨天這個時間,等等......並且指出這是一個緩慢還是快速的日子。)我該怎麼做?

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) 

回答

1

感謝您對所有的答案。雖然他們沒有做到我想要的東西,但這是我的最後一個問題,以防它可能幫助某人。答案的問題,也可能是我的問題,結果只顯示每小時的總請求數,而不是當天的最終總數。我的查詢在下面給出了每小時的請求數,以及當天的最終請求數,或者當前總數,如果是當天。

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 | 
+------------+----------+----------+ 
0
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 
+0

是Microsoft SQL服務器? Msg 102,Level 15,State 1,Line 15 ')'附近語法不正確。 – 2014-11-14 12:48:54

+0

如果我刪除了第15行的右括號並將[請求]更改爲[請求],它可以正常工作,但並不能完全滿足我的要求。它給出了單個日期,小時值和請求,但是如果我爲昨天的日期運行它,它會給我當天的總請求數。 – 2014-11-14 12:51:04

+0

編輯修復了在第4行中爲'@CurrentDate'修正錯字 - 交換'getdate()' – paul 2014-11-14 13:03:47

2

下面應該工作

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) 
+0

不知道這是什麼版本的SQL,但是我將接受這個...但是,它只適用於我if我將查詢更改爲使用rank()函數。因此它使用「rank()OVER(ORDER BY DATEPART(hour,DateCreated))」 – 2014-11-14 13:06:57

+0

這是針對SQL Server 2008 R2的。 – 2014-11-14 13:39:58

0
 --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)