2010-03-25 128 views
1

此查詢每小時生產的登錄次數:SQL:每日平均登錄每小時

SELECT DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0), 
     COUNT(*) 
    FROM EVENTS_ALL_RPT_V1 
WHERE EVENT_NAME = 'Login' 
    AND EVENT_DATETIME >= CONVERT(DATETIME, '2010-03-17 00:00:00', 120) 
    AND EVENT_DATETIME <= CONVERT(DATETIME, '2010-03-24 00:00:00', 120) 
GROUP BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0) 
ORDER BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0) 

...有很多的結果是這樣的:

Datetime     COUNT(*) 
---------------------------------- 
2010-03-17 12:00:00.000 135 
2010-03-17 13:00:00.000 129 
2010-03-17 14:00:00.000 147 

我需要什麼人物out是如何查詢給定日期的每小時平均登錄次數。任何幫助?

+0

您發佈的查詢使用TSQL(由SQL Server&Informix使用),但您將其標記爲MySQL,並且在您評論我的答案時明顯返回了MySQL錯誤1064 - 語法錯誤... – 2010-03-26 02:28:46

+0

非常抱歉。正在試圖幫助一個朋友,但他沒有提及他沒有使用mySQL,我愚蠢地認爲他是。我很抱歉。 – jerrygarciuh 2010-03-26 16:34:23

回答

5

使用AVG聚合函數:

SELECT CONCAT(DATE_FORMAT(t.event_datetime, '%Y-%m-%d %H'), ':00:00.000') AS hr, 
     COUNT(*) AS cnt, 
     AVG(*) AS avg 
    FROM EVENTS_ALL_RPT_V1 t 
    WHERE t.event_name = 'Login' 
    AND t.event_datetime BETWEEN '2010-03-24' AND '2010-03-17' 
GROUP BY CONCAT(DATE_FORMAT(t.event_datetime, '%Y-%m-%d %H'), ':00:00.000') 
ORDER BY hr 

ORDER BY子句可以使用列別名,但GROUP BY不能。

+0

謝謝你的回覆!嘗試這個我得到:#1064 - 你的SQL語法有錯誤; (*)AS cnt, AVG(*)AS avg 'at line 1 – jerrygarciuh 2010-03-25 15:46:43

0

你可以做這樣的事情

SELECT AVG(cnt) FROM (
    your other query 
) 

但你需要命名的第二列cnt,也許增加一個where子句,只有着眼於給定的日期。

+0

這會給出平均返回的所有小時數,而不是像OP所要求的那樣每小時。 – 2010-03-25 14:57:28

0

這將在3月18日每小時選擇所有登錄,然後計算平均值。

SELECT AVG(count) FROM 
(
    SELECT COUNT(*) count 
    FROM EVENTS_ALL_RPT_V1 
    WHERE EVENT_NAME = 'Login' AND 
    EVENT_DATETIME >= CONVERT(DATETIME,'2010-03-18 00:00:00', 120) AND 
    EVENT_DATETIME <= CONVERT(DATETIME,'2010-03-19 00:00:00', 120) 
    GROUP BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0) 
    ORDER BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0) 
) 
+0

這會給出平均返回的所有小時數,而不是像OP要求的那樣每小時。 – 2010-03-25 14:58:53

+0

他已經有了查詢來獲得特定日期每小時每小時的平均登錄次數,他只是將其設置爲一週。 – Fabian 2010-03-25 15:07:44

0

對於2010年3月17日:

SELECT COUNT(*)/24 
    FROM EVENTS_ALL_RPT_V1 
WHERE EVENT_NAME = 'Login' 
    AND EVENT_DATETIME >= CONVERT(DATETIME, '2010-03-17 00:00:00', 120) 
    AND EVENT_DATETIME < CONVERT(DATETIME, '2010-03-18 00:00:00', 120) 
+0

這就是爲什麼你的MySQL服務器版本與你的MySQL服務器版本相對應,以便在't.event_datetime'附近使用正確的語法。假設人們每天的每個小時都登錄。 – Fabian 2010-03-25 15:08:54

+0

@Fabian:不,它並不假設他們每小時登錄一次。相反,它不會*忽視他們不登錄的時間。問題標題是每日平均值,而不是用戶登錄時間的平均值 - 我的答案反映了我對OP所要求的內容的理解。 – RedFilter 2010-03-25 15:23:50

1
SELECT AVG(m.countLogin) FROM 
(SELECT DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0), 
    COUNT(*) as countLogin 
    FROM EVENTS_ALL_RPT_V1 
    WHERE EVENT_NAME = 'Login' 
    AND EVENT_DATETIME >= CONVERT(DATETIME, '2010-03-17 00:00:00', 120) 
    AND EVENT_DATETIME <= CONVERT(DATETIME, '2010-03-24 00:00:00', 120) 
    GROUP BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0) 
    ORDER BY DATEADD(hour, DATEDIFF(hour, 0, EVENT_DATETIME), 0)) m 

注意:不要忘了給別名爲新的外部表。