sql >> データベース >  >> RDS >> Oracle

レコードを時間ごとまたは日ごとにグループ化し、mysqlでギャップをゼロまたはnullで埋めます

    単一列の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. Oracleクエリの最適化

    2. SQL Server(T-SQL)のパーティション関数のパラメータータイプを確認します

    3. PG ::ConnectionBad:FATAL:ユーザーalphauserのパスワード認証に失敗しました

    4. 行が存在するかどうかをチェックするPL/pgSQL