2012-04-08 12 views
2

Betrachten Sie die folgende Tabelle:Wie wird die Anzahl der Nachrichten pro halbe Stunde gezählt?

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

Ich bin derzeit die Anzahl der Nachrichten pro Stunde aggregieren, wie folgt:

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

Dieses in einem resultset ergibt sich wie folgt:

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

Was ich will, ist jedoch die Anzahl pro halb Stunde:

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

Was ist die Abfrage, die dies ermöglicht? Bei Bedarf könnte ich einen Tisch mit der halben Stunde (00:00, 00:30, 01:00, 01:30, ... 23:00, 23:30) mkachen, aber lieber nicht. (Und ich würde immer noch nicht wissen, wie man diesen Tisch benutzt).

Jede Hilfe wird sehr geschätzt :-)

+0

Warum heißt die Spalte immer noch "Stunde"? Vielleicht wäre "Zeit" angemessener? –

+0

Sie können Minute (_time) durch 30 teilen und gruppieren um diesen Wert zusätzlich zu Stunden. Möglicherweise müssen Sie result in int umwandeln, da bin ich mir nicht sicher. –

+0

Hey! Hast du dein Problem gelöst? Wenn ja, markieren Sie bitte die Antwort, die es als die richtige Antwort gelöst hat, um anderen zu helfen. Wenn nicht, bitte geben Sie uns Feedback darüber. – rcdmk

Antwort

5

können Sie case when

verwenden
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 
+1

Danke! Ich habe deine und Alerots Anfragen kombiniert, weil deine die halben Stunden '10:30, 11:00, 11:30, usw.' in der Ergebnismenge angezeigt haben, aber sie hat nicht richtig sortiert. Die Ausgabe war: "0:00, 0:30, 10:00, 10:30" und ich wusste nicht recht, wie ich das beheben sollte.Also habe ich 'SELECT CONCAT (CAST (HOUR (nyse_time) AS CHAR (2)),': ', (CASE WANN MINUTE (nyse_time) <30 THEN' 00 'ELSE' 30 'ENDE)) AS halfhour, COUNT (tweet_id) AS cnt Von Tweets GROUP BY HOUR (nyse_time), FLOOR (MINUTE (nyse_time)/30) ' – Pr0no

+1

Sehr gut, Sie haben es geschafft. Um es besser sortieren zu können, müssen Sie nach HOUR (_TIME) ASC, MINUTE (_TIME) ASC sortieren – rcdmk

4

ich denke, ich eine Tabelle mit der halben Stunde mal (00:00, 00:30, 01:00, 01:30, mkae könnte .. . 23:00, 23:30), aber lieber nicht.

Ja, das ist die richtige Lösung, wenn Sie gezwungen sind, MySQL zu verwenden. Ein anderer Weg ist möglich, kann aber unordentlich werden und wird langsamer.

(Und ich würde immer noch nicht wissen, wie diese Tabelle entweder verwenden)

ein LEFT JOIN:

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 
+0

Danke! Das ist, was ich dachte, aber wenn ich mir die anderen Vorschläge anschaue, ist es in MySQL ohne Hilfstafel möglich :-) – Pr0no

3

von auf diese Weise zu einer Gruppe Versuche:

group by hour(_time), floor(minute(_time)/30) 
+0

Thakns! Um auch '10:30, 11:00, 11:30 usw. 'in der Ergebnismenge zu erhalten, habe ich einen Teil der Anfrage von rcdmk verwendet:' SELECT CONCAT (CAST (HOUR (nyse_time) AS CHAR (2))'): ', (FALL WENN MINUTE (nyse_time) <30 THEN' 00 'ELSE' 30 'END)) AS Halfhour, COUNT (tweet_id) AS cnt VON tweets GROUP BY HOUR (nyse_time), FLOOR (MINUTE (nyse_time)/30) ' – Pr0no

Verwandte Themen