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

日付部分に基づいて行を多くの行にグループ化解除します

    私はストアドプロシージャの経験があまりないため、パフォーマンスについてはよくわかりません。そのため、より良いアプローチがあるかもしれません。また、一時テーブルの構造を変更することもできます(別名PolicyList )。とにかく…

    これは、毎回実行する代わりに、トリガーの前後に変換することもできます。

    DROP PROCEDURE IF EXISTS CreatePolicyList;
    
    DELIMITER //
    CREATE PROCEDURE CreatePolicyList()
    BEGIN
        DECLARE origId, done INT DEFAULT 0;
        DECLARE startD, endD DATE;
    
        DECLARE cur CURSOR FOR
            SELECT id, StartDate, EndDate FROM Policy;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
        DROP TEMPORARY TABLE IF EXISTS PolicyList;
        CREATE TEMPORARY TABLE PolicyList (
            id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
            PolicyId INT(11) NOT NULL,
            StartDate DATE NOT NULL,
            EndDate DATE NOT NULL,
            PRIMARY KEY (id)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
        OPEN cur;
        recLoop: LOOP
            FETCH cur INTO origId, startD, endD;
            IF (done)
                THEN LEAVE recLoop;
            END IF;
    
            -- following is an alternative to keep records like
            -- "2011-05-25, 2011-06-25" in a single record
            -- WHILE startD < DATE_SUB(endD, INTERVAL 1 MONTH) DO
            WHILE startD < DATE_ADD(DATE_SUB(endD, INTERVAL 1 MONTH), INTERVAL 1 DAY) DO
                INSERT INTO PolicyList (PolicyId, StartDate, EndDate)
                VALUES (origId, startD,DATE_SUB(
                    DATE_ADD(startD, INTERVAL 1 MONTH),
                    INTERVAL 1 DAY
                ));
                SET startD = DATE_ADD(startD, INTERVAL 1 MONTH);
            END WHILE;
    
            IF startD >= DATE_SUB(endD, INTERVAL 1 MONTH) THEN
                INSERT INTO PolicyList (PolicyId, StartDate, EndDate)
                VALUES (origId, startD, endD);
            END IF;
        END LOOP;
        CLOSE cur;
    
    END //
    
    CALL CreatePolicyList;
    

    次にクエリを実行します:

    SELECT * FROM PolicyList
    ORDER BY PolicyId, StartDate;
    



    1. Postgresログファイルに含まれるもの:pg_toast_2619のトースト値815441のチャンク番号0がありません

    2. mysqlシステムコマンド

    3. ルーム永続ライブラリを使用してパラメータで更新

    4. CodeIgniterでバッチを更新する