2

次の表を検討してください。

msg_id  _time
-------------
1       13:32
2       13:56
3       14:05
4       15:00
5       15:17
6       15:28
7       16:40

現在、次のように、1 時間あたりのメッセージ数を集計しています。

SELECT HOUR(_time) AS hour, COUNT(msg_id) AS cnt FROM messages GROUP BY hour 
ORDER BY hour

これにより、結果セットは次のようになります。

hour  cnt
---------
13    2
14    1
15    3
16    1

ただし、私が欲しいのは、30分あたりのカウントです。

hour   cnt
----------
13:30  2
14:00  1
14:30  0
15:00  3
15:30  0
16:00  0
16:30  1

これを可能にするクエリは何ですか? 必要に応じて、30 分の時刻 (00:00、00:30、01:00、01:30、... 23:00、23:30) を含むテーブルを作成できると思いますが、あまり好みません。(そして、そのテーブルの使い方もまだわかりません)。

どんな助けでも大歓迎です:-)

4

3 に答える 3

5

あなたが使用することができますcase when

SELECT COUNT(msg_id) AS cnt, CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END)) AS hour
FROM messages
GROUP BY CONCAT(CAST(HOUR(_TIME) AS CHAR(2)), ':', (CASE WHEN MINUTE(_time) < 30 THEN '00' ELSE '30' END))
ORDER BY hour
于 2012-04-08T20:53:21.213 に答える
4

30 分の時間 (00:00、00:30、01:00、01:30、... 23:00、23:30) を含むテーブルを作成できると思いますが、あまり好みません。

はい、MySQL を使用せざるを得ない場合、これが正しい解決策です。別の方法で行うことも可能ですが、面倒になり遅くなる可能性があります。

(そして、そのテーブルの使い方もまだわかりません)

左結合を使用します。

SELECT
    halfhours.start AS hour,
    COUNT(*) AS count
FROM halfhours
LEFT JOIN messages
ON messages._time >= halfhours.start AND messages._time < halfhours.end
GROUP BY halfhours.start
于 2012-04-08T20:49:34.103 に答える
3

この方法でグループ化してみてください:

group by hour(_time), floor(minute(_time)/30)
于 2012-04-08T20:51:16.660 に答える