sql >> Database >  >> RDS >> Sqlserver

Groepeer rijen met een tussenpoos van minder dan 15 dagen en wijs een min/max-datum toe

Zoals vermeld in opmerkingen, kunt u de LAG . gebruiken hiervoor functioneren. Het basisidee is om aan elke rij een 0/1-waarde toe te kennen:als het binnen 15 dagen van de vorige rij is, dan 0 else 1. Gebruik dan SUM() OVER () om de enen en nullen om te zetten in getallen die kunnen worden gebruikt voor groepering.

Merk op dat dit veel langere perioden kan groeperen, b.v. 01-01 , 01-11 , 01-21 , 02-01 en 02-11 worden gegroepeerd, hoewel de eerste en laatste datum meer dan 15 dagen uit elkaar liggen.

DECLARE @T TABLE (HASTA_ID INT, PROTOKOL_ID INT, STARTDATE DATE, ENDDATE DATE);
INSERT INTO @T VALUES
(273065, 11, '2018-01-24', '2018-01-30'),
(273065, 12, '2018-01-25', '2018-02-10'),
(273065, 13, '2018-01-30', '2018-01-30'),
(273065, 14, '2018-02-23', '2018-02-28'),
(273065, 15, '2018-03-21', '2018-03-29'),
(273065, 16, '2018-05-03', '2018-05-04'),
(273065, 17, '2018-05-03', '2018-05-08'),
(273065, 18, '2018-05-14', '2018-05-22'),
(273065, 19, '2018-05-22', '2018-05-23'),
(273065, 20, '2018-09-20', '2018-09-30');

WITH CTE1 AS (
    SELECT *, CASE WHEN LAG(STARTDATE) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) >= DATEADD(DAY, -14, STARTDATE) THEN 0 ELSE 1 END AS CHG
    FROM @T
), CTE2 AS (
    SELECT *, SUM(CHG) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) AS GRP
    FROM CTE1
)
SELECT *,
    MIN(STARTDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_STARTDATE,
    MAX(ENDDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_ENDDATE
FROM CTE2
ORDER BY HASTA_ID, STARTDATE

Demo op DB Fiddle




  1. Spoorcausaliteit gebruiken om de uitvoering van query's te begrijpen

  2. Trigger voor alleen gewijzigde waarden

  3. Hoe relaties tussen tabellen te kennen

  4. Een schema genereren vanuit een CSV voor een PostgreSQL-kopie