2016-04-02 77 views
0

我正在尝试构建一个查询来查找给定日期内每个广播小时播放的音乐曲目的平均数量。计算每小时的项目数,然后查找结果的平均值

我有一个表根据日期时间值(创建的字段)记录播放曲目的时间。

所以我需要统计每小时记录多少条目或轨道。

然后用小时总计找到平均值。

到目前为止,我有这个,但想知道它是否正确?

SELECT AVG(a.total) FROM (
    SELECT HOUR(created) AS hour, COUNT(id) AS total 
    FROM `music_log` r 
    WHERE DATE(created) = DATE(DATE_SUB(NOW() , INTERVAL 1 DAY)) group by HOUR(r.created) 
) a 

我得承认,我制定了从其他岗位上的计算器,不明白什么一个[R平均值/参考。

我想知道我是否有这个权利,所以我可以扩展查询以涵盖四分之一(3个月)的结果。

+0

看起来不错。请注意,DATE(已创建)不能使用索引。 A和r是别名。 R并不是绝对必要的,但一个是。 – Strawberry

+0

哦对。所创建的不能是表中的索引。是对的吗?我以前没有遇到任何问题。 – mattauckland

+0

创建可以索引。 DATE()不能利用该索引。如果可能的话(有时它不是),最好编写查询以便可以利用该索引,例如, :'WHERE created BETWEEN'2016-04-02 00:00:00'AND'2016-04-02 23:59:59';' – Strawberry

回答

0

正如草莓所说,它看起来像我在正确的轨道上。谢谢草莓。

为了扩大这一点,以防万一它帮助其他人,我已经把查询包括在本季度中,在本例中是今年的第一季度......他说希望没有任何问题我的查询:)

SELECT AVG(a.total) FROM (
    SELECT DATE(created) as day, HOUR(created) AS hour, COUNT(id) AS total 
    FROM `music_log` 
    WHERE QUARTER(created) = 1 
    AND YEAR(created) = YEAR(NOW()) 
    group by DATE(created), HOUR(created) 
) a 

为了正确计算它,我需要将按小时计算的结果按日期和小时进行分组。

在问题中的上一个查询中,它只是按小时分组。如果“平均”计算仅在一天之内,那么这很好,但如果您将这一点扩展到一天以上,结果就会变得不正确。这是因为它会增加下午11点发生的总数,然后计算出平均值。

希望帮助...或者,如果我犯了一个错误,我希望它有人拿起;)

1

可以计算平均无子查询:

SELECT COUNT(*)/COUNT(DISTINCT DATE(created), HOUR(created)) as average 
FROM `music_log` 
WHERE QUARTER(created) = 1 AND YEAR(created) = YEAR(NOW()) ; 

这算总计数和小时数而不需要子查询。