Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Agrupando registros hora a hora ou dia a dia e preenchendo lacunas com zero ou nulo no mysql


Gere um dates_hours de coluna única tabela que contém todas as datas e horas dentro de um intervalo razoável (por exemplo, de 1900 a 2200). Em seguida, faça um LEFT JOIN desta tabela para sua consulta atual.

Para que esta técnica funcione corretamente, você provavelmente precisará adicionar uma coluna indexada à sua tabela que contém um carimbo de hora convertido (seu copied_timestamp convertido para DATETIME , arredondado para a hora)
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

Para gerar as dates_hours tabela:
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, agora que estou revisando a mim mesmo, percebo que esta é uma solução bastante rebuscada. Espero que alguém venha com um mais elegante.