Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Grupuj wiersze z odstępem krótszym niż 15 dni i przypisz min./maks. datę

Jak wspomniano w komentarzach, możesz użyć LAG funkcja do tego. Podstawowym pomysłem jest przypisanie wartości 0/1 do każdego wiersza:jeśli jest w ciągu 15 dni od poprzedniego wiersza, to 0 innego 1. Następnie użyj SUM() OVER () aby zamienić jedynki i zera na liczby, które można wykorzystać do grupowania.

Pamiętaj, że może to zgrupować znacznie dłuższe zakresy dat, np. 01-01 , 01-11 , 01-21 , 02-01 i 02-11 zostaną zgrupowane, chociaż pierwsza i ostatnia data są od siebie oddalone o więcej niż 15 dni.

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 na DB Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie się z MS sql przez hibernację

  2. Najlepszy sposób na wyodrębnienie danych z xml za pomocą xquery

  3. Dynamiczna konwersja wierszy na kolumny SQL

  4. Zaszyfruj dane kolumn za pomocą LINQ

  5. Jak naprawić „wyrażenie EXECUTE nie powiodło się, ponieważ jego klauzula WITH RESULT SETS określiła 1 zestaw wyników…” w programie SQL Server