sql >> Database >  >> RDS >> Oracle

Records van uur tot uur of van dag tot dag groeperen en hiaten opvullen met nul of null in mysql

Genereer een enkele kolom dates_hours tabel die alle datums en uren bevat binnen een redelijk bereik (bijvoorbeeld van 1900 tot 2200). Doe dan een LEFT JOIN van deze tabel naar uw huidige zoekopdracht.

Om deze techniek correct te laten werken, moet u waarschijnlijk een geïndexeerde kolom aan uw tabel toevoegen die een geconverteerde tijdstempel bevat (uw copied_timestamp geconverteerd naar DATETIME , afgerond op het uur)

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

Om de dates_hours te genereren tafel:

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é, nu ik mezelf aan het proeflezen ben, realiseer ik me dat dit een nogal vergezochte oplossing is. Ik hoop dat iemand met een elegantere komt.



  1. De server reageert niet (of de socket van de lokale MySQL-server is niet correct geconfigureerd) in de wamp-server

  2. PHP-webtoepassing:vraag over best practices voor mysql-databaseontwerp

  3. Hoe gebruik ik Timestamp_to_scn en Scn_to_timestamp in Oracle?

  4. Selecteer minimaal twee data