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

Gruppering af poster time for time eller dag for dag og udfylde huller med nul eller null i mysql

Generer en enkelt kolonne dates_hours tabel, som indeholder alle datoer og timer inden for et rimeligt interval (f.eks. fra 1900 til 2200). Udfør derefter en LEFT JOIN fra denne tabel til din aktuelle forespørgsel.

For at denne teknik skal fungere korrekt, skal du sandsynligvis tilføje en indekseret kolonne til din tabel, som indeholder et konverteret tidsstempel (dit copied_timestamp konverteret til DATETIME , afrundet til timen)

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

For at generere dates_hours tabel:

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, nu hvor jeg korrekturlæser mig selv, indser jeg, at dette er en ret langt ude løsning. Jeg håber, nogen finder på en mere elegant.



  1. mysql hvad er den rigtige syntaks for denne betingede opdateringserklæring

  2. cx oracle ImportError

  3. Hvordan kan jeg implementere et .NET-program, der bruger ODAC uden at installere hele komponenten til brugeren?

  4. mySQL- og PHP-kodninger