sql >> Databáze >  >> RDS >> Oracle

Seskupování záznamů hodinu po hodině nebo den po dni a vyplňování mezer nulou nebo nulou v mysql

Vygenerujte jednosloupcový dates_hours tabulka, která obsahuje všechna data a hodiny v přiměřeném rozsahu (např. od 1900 do 2200). Potom proveďte LEFT JOIN z této tabulky na váš aktuální dotaz.

Aby tato technika fungovala správně, budete pravděpodobně muset do tabulky přidat indexovaný sloupec, který obsahuje převedené časové razítko (vaše copied_timestamp převedeno na DATETIME , zaokrouhleno na hodiny)

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

Chcete-li vygenerovat dates_hours tabulka:

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

Dobře, teď, když dělám korekturu, si uvědomuji, že je to dost přitažené za vlasy řešení. Doufám, že někdo přijde s elegantnějším.



  1. Základy tabulkových výrazů, 2. část – Odvozené tabulky, logické úvahy

  2. Jsou levé vnější spoje a levé spoje stejné?

  3. Zrušit aktuální/aktivní dotaz v Ruby on Rails

  4. Záludný dávkový dotaz MySQL