Oracle
 sql >> Database >  >> RDS >> Oracle

Raggruppare i record ora per ora o giorno per giorno e colmare le lacune con zero o null in mysql

Genera una singola colonna dates_hours tabella che contiene tutte le date e le ore entro un intervallo ragionevole (ad es. da 1900 a 2200). Quindi fai un LEFT JOIN da questa tabella alla query corrente.

Affinché questa tecnica funzioni correttamente, probabilmente dovrai aggiungere una colonna indicizzata alla tabella che contiene un timestamp convertito (il tuo copied_timestamp convertito in DATETIME , arrotondato all'ora)

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

Per generare le dates_hours tabella:

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');

Ok, ora che mi sto rileggendo da solo, mi rendo conto che questa è una soluzione abbastanza inverosimile. Spero che qualcuno ne esca uno più elegante.