sql >> Database >  >> RDS >> Mysql

Groepering van een rij opheffen in veel rijen op basis van datumdelen

Ik ben niet zeker van de prestaties omdat ik niet veel ervaring heb met opgeslagen procedures, dus er is misschien een betere aanpak. U wilt misschien ook de structuur van de tijdelijke tabel wijzigen (ook bekend als PolicyList ). Hoe dan ook…

Dit kan ook worden omgezet in voor/na triggers in plaats van het elke keer uit te voeren.

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;

en vraag dan:

SELECT * FROM PolicyList
ORDER BY PolicyId, StartDate;



  1. Hoe JSON uit de Doobie Scala PostgreSQL-database te lezen met Circe?

  2. ERROR 1148:Het gebruikte commando is niet toegestaan ​​met deze MySQL-versie

  3. Oracle SQL:een enkele rij selecteren met de laatste datum tussen meerdere kolommen

  4. Een hoeveelheid verwijderen uit meerdere rijen in een database