2010-03-25 159 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 

注意:不要忘了给别名为新的外部表。