sql >> Databasteknik >  >> RDS >> Oracle

Gruppera poster timme för timme eller dag för dag och fylla luckor med noll eller null i mysql

Generera en enkolumn dates_hours tabell som innehåller alla datum och timmar inom ett rimligt intervall (t.ex. från 1900 till 2200). Gör sedan en LEFT JOIN från den här tabellen till din aktuella fråga.

För att den här tekniken ska fungera korrekt måste du förmodligen lägga till en indexerad kolumn i tabellen som innehåller en konverterad tidsstämpel (din copied_timestamp konverterad till DATETIME , avrundat till timmen)

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

För att generera dates_hours tabell:

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

Okej, nu när jag korrekturläser mig själv inser jag att detta är en ganska långsökt lösning. Jag hoppas att någon kommer på en mer elegant.



  1. Hur kontrollerar man om en MySQL-anslutning är SSL-krypterad?

  2. PL/SQL-program för att ta bort posterna från tabellen

  3. MySQL:Få ett radnummer (ranking) för en specifik rad

  4. Beställt antal på varandra följande upprepningar / dubbletter