2017-07-11 3 views
0

Ich habe eine Abfrage, die wie folgt aussieht:Finden Lücken zwischen dem Zeitstempel von 1 Stunde und Gruppe von Stunde, Datum, Woche und Monat - MySql

SELECT count(*), date_format(created, '%H:%i - %d/%m/%y') as 
datecreated 
FROM mimesi_realtime.served_clips 
where created > NOW() - INTERVAL 48 HOUR 
group by date_format(created, '%H - %d/%m/%y') 
order by min(created) ASC; 

48 Es im Grunde tut eine Zählung für jede Stunde in den letzten Stunden und sortiert die Ergebnisse in einer chronologischen Reihenfolge

Das Problem ist, dass in der Nacht, vor allem von 22.00 bis 05.00 keine Daten registriert sind, und ich brauche die Zählung zeigt 0 für jede Stunde sowieso

Anzahl (*) ist in die linke Spalte
erstellt ist die richtige

a) Ist-Ergebnis:

- 261, 20:00 - 11/04/17 
- 133, 21:00 - 11/04/17 
- 208, 22:00 - 11/04/17 
- 358, 5:00 - 12/04/17 
- 489, 6:00 - 12/04/17 

b) erwartete Ergebnis:

- 261, 20:00 - 11/04/17 
- 133, 21:00 - 11/04/17 
- 208, 22:00 - 11/04/17 
- 0, 23:00 - 11/04/17 
- 0, 24:00 - 11/04/17 
- 0, 1:00 - 12/04/17 
- 0, 2:00 - 12/04/17 
- 0, 3:00 - 12/04/17 
- 0, 4:00 - 12/04/17 
- 358, 5:00 - 12/04/17 
- 489, 6:00 - 12/04/17 

Gibt es eine Möglichkeit, wie ich dies tun könnte ?

+0

Wenn Sie etwas auswählen, dann müssen Sie in der Regel durch die gleiche Sache gruppieren. Weitere Informationen finden Sie unter https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-y-simple -sql-query – Strawberry

+0

wir haben dieses Problem gestern gelöst, nicht wahr? https://stackoverflow.com/questions/45011431/find-missing-date-and-add-them-into-result-mysql –

+0

@EstebanP. das haben wir nur für Tage und Monate gemacht. Aber ich habe versucht, es für Stunden und Wochen zu tun, aber es funktioniert nicht – GPecchio

Antwort

1

Die übliche Lösung für Ihr Problem wäre, eine Kalender Tabelle zu erstellen, die alle Zeitstempel enthält, die in Ihrem Bericht angezeigt werden sollen. Wenn Sie keine Tabellen erstellen können, können Sie einen Inline-Ansatz verwenden, z.

(
    SELECT '2017-11-07 00:00:00' AS ts UNION ALL 
    SELECT '2017-11-07 01:00:00'  UNION ALL 
    ... 
    SELECT '2017-11-07 23:00:00' 
) t 

dann links die Kalender-Tabelle, um Ihre aktuelle Tabelle beitreten und eine ähnliche Abfrage tun:

SELECT 
    COUNT(t2.created), 
    DATE_FORMAT(t1.ts, '%H - %d/%m/%y') AS datecreated 
FROM calendar t1 -- possibly replace with inline table 
LEFT JOIN mimesi_realtime.served_clips t2 
    ON DATE_FORMAT(t1.ts, '%H - %d/%m/%y') = DATE_FORMAT(t2.created, '%H - %d/%m/%y') 
WHERE t1.ts > NOW() - INTERVAL 48 HOUR 
GROUP BY DATE_FORMAT(t1.ts, '%H - %d/%m/%y') 
ORDER BY MIN(t1.ts) 

Wenn Sie nicht wollen, mit einer Kalender-Tabelle arbeiten dann wäre eine weitere Option ein haben geplanter Prozess, der jede Stunde einen einzelnen Dummy-Datensatz schreibt. Dies würde garantieren, dass jeder Zeitpunkt in Ihrer Tabelle erscheint. Es hat den Nachteil, dass etwas Platz verschwendet wird und es Zeit kostet, es einzurichten.

+0

Ja, ich dachte darüber nach, aber das Problem ist, dass ich die Datenbank nicht ändern kann, aber ich kann nur Abfragen ausführen – GPecchio

+0

@GPecchio Kein Problem. Sie können dann eine Inline-Kalendertabelle verwenden, die Ihr Code für den gewünschten Zeitraum generiert. –

+0

könnte die Inline-Tabelle dynamisch sein, da ich die Daten der letzten 48 Stunden brauche? – GPecchio

Verwandte Themen