Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gruppieren von Datensätzen Stunde für Stunde oder Tag für Tag und Füllen von Lücken mit Null oder Null in mysql

Generieren Sie ein einspaltiges dates_hours Tabelle, die alle Daten und Stunden in einem angemessenen Bereich enthält (z. B. von 1900 bis 2200). Führen Sie dann einen LEFT JOIN durch von dieser Tabelle zu Ihrer aktuellen Abfrage.

Damit diese Technik richtig funktioniert, müssen Sie Ihrer Tabelle wahrscheinlich eine indizierte Spalte hinzufügen, die einen konvertierten Zeitstempel enthält (Ihr copied_timestamp umgewandelt in DATETIME , auf die Stunde gerundet)

SELECT date_hour, count(req.converted_timestamp)
FROM
    dates_hours 
    LEFT JOIN req ON req.converted_timestamp = dates_hours.date_hour
WHERE date_hour
    BETWEEN (SELECT MIN(req.converted_timestamp) FROM req)
    AND (SELECT MAX(req.converted_timestamp) FROM req)
GROUP BY date_hour

Um die dates_hours zu generieren Tabelle:

CREATE TABLE dates_hours (date_hour DATETIME PRIMARY KEY);

DELIMITER $$$
CREATE PROCEDURE generate_dates_hours (to_date DATETIME)
BEGIN

    DECLARE start_date DATETIME;
    DECLARE inc INT;

    SELECT MAX(date_hour) INTO start_date FROM dates_hours;
    IF start_date IS NULL THEN
        SET start_date = '1900-01-01';
    END IF;
    SET inc = 1;
    WHILE start_date + INTERVAL inc HOUR  <= to_date DO
        INSERT INTO dates_hours VALUE (start_date + INTERVAL inc HOUR);
        SET inc = inc +1;
    END WHILE;

END $$$
DELIMITER ;

CALL generate_dates_hours('2200-01-01');

Okay, jetzt, wo ich selbst Korrektur lese, ist mir klar, dass das eine ziemlich weit hergeholte Lösung ist. Ich hoffe, jemand hat eine elegantere Idee.