Oracle
 sql >> база данни >  >> RDS >> Oracle

Групиране на записи час по час или ден по ден и попълване на празнини с нула или нула в mysql

Генерирайте dates_hours с една колона таблица, която съдържа всички дати и часове в разумен диапазон (напр. от 1900 до 2200). След това направете LEFT JOIN от тази таблица към текущата ви заявка.

За да работи тази техника правилно, вероятно ще трябва да добавите индексирана колона към вашата таблица, която съдържа преобразуван времеви печат (вашият copied_timestamp преобразуван в DATETIME , закръглено до часа)

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

За генериране на dates_hours таблица:

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

Добре, сега, когато проверявам себе си, осъзнавам, че това е доста пресилено решение. Надявам се някой да измисли по-елегантен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Еквивалентна функция за DATEADD() в Oracle

  2. Подредете в зависимост от стойностите на 2 колони

  3. PL/SQL процес:проблем с формулировката

  4. Може ли тригер на Oracle да бъде деактивиран за текущата сесия?

  5. Как мога да заменя скоби с тирета във функцията REGEXP_REPLACE на Oracle?