2016-04-02 5 views
0

私は、特定の日の放送時間あたりに再生された音楽トラックの平均数を見つけるためにクエリを作成しようとしています。1時間あたりのアイテム数をカウントして、結果の平均を探します。

私は、日時の値(作成されたフィールド)に基づいてトラックが再生されたときに記録するテーブルを持っています。

したがって、1時間に記録されるエントリまたはトラックの数をカウントする必要があります。

次に、1時間ごとの合計で平均を求めます。

これまでのところ、私はこれを持っていましたが、それが正しいかどうか疑問に思っていましたか?私は認めざるを得

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 

は、私は別のポストからのstackoverflowの上で、どのような R平均/参照を理解していないことを策定しました。

私はこの権利があるかどうかを知りたいので、四半期(3ヶ月)の結果をカバーするようにクエリを拡張できます。

+0

非常によく見えます。 DATE(作成済み)は索引を使用できないことに注意してください。 Aとrはエイリアスです。 Rは厳密には必要ではないが、aである。 – Strawberry

+0

ああ。したがって、作成されたテーブルのインデックスにすることはできません。そうですか?以前は何の問題もありませんでした。 – mattauckland

+0

が作成されます。 DATE()はそのインデックスを利用できません。可能であれば(場合によってはそうでない場合もあります)、インデックスを利用できるようにクエリを書く方が良いです(例: : 'BETWEEN 'を作成した場所2016-04-02 00:00:00' AND '2016-04-02 23:59:59';' – Strawberry

答えて

0

ストロベリーによれば、私は正しい軌道にいるようです。ありがとうストロベリー。

これを拡張して他の誰にも役立つ場合は、四半期をカバーするクエリを含めました。この場合は今年の第1四半期です。私の質問:)

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 

正しく計算するために、私は時間と時間で時間の結果をグループ化する必要がありました。

質問の前のクエリでは、時間単位でのみグループ化されていました。平均計算が単なる1日を超える場合は問題ありませんが、1日を超えてそれを展開すると、結果は正しくなりません。これは、例えば11pmの両方の発生の合計を加算して平均を計算するためです。

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

この計算:あなたは、サブクエリなしで平均を計算することができます

1

);ことができます...または私はミスを犯してしまった場合、私は誰かがそれを拾っ願ってい

・ホープサブクエリを必要とせずに、合計数と時間数を指定できます。