sql >> Databáze >  >> RDS >> Sqlserver

Seskupit řádky, které jsou od sebe vzdáleny méně než 15 dní, a přiřadit minimální/maximální datum

Jak je uvedeno v komentářích, můžete použít LAG funkce pro toto. Základní myšlenkou je přiřadit každému řádku hodnotu 0/1:pokud je do 15 dnů od předchozího řádku, pak 0, jinak 1. Pak použijte SUM() OVER () pro převod 1 a 0 na čísla, která lze použít pro seskupování.

Upozorňujeme, že by to mohlo seskupit mnohem delší období, např. 01-01 , 01-11 , 01-21 , 02-01 a 02-11 budou seskupeny, ačkoli mezi prvním a posledním datem je více než 15 dní.

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

Ukázka na DB Fiddle




  1. operace přejmenování souboru utl se nezdařila

  2. Upozornění:Navazování SSL připojení bez ověření identity serveru nedoporučujeme

  3. Důvod pro použití @@identity spíše než scope_identity

  4. Vložte časové razítko do databáze pomocí ContentValues