Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Групирайте редове с разлика, по-малка от 15 дни, и задайте минимална/максимална дата

Както бе споменато в коментарите, можете да използвате LAG функция за това. Основната идея е да присвоите стойност 0/1 на всеки ред:ако е в рамките на 15 дни от предишния ред, тогава 0 иначе 1. След това използвайте SUM() OVER () за преобразуване на 1s и 0s в числа, които могат да се използват за групиране.

Обърнете внимание, че това може да групира заедно много по-дълги периоди от време, напр. 01-01 , 01-11 , 01-21 , 02-01 и 02-11 ще бъдат групирани заедно, въпреки че първата и последната дата са на разстояние повече от 15 дни.

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

Демо на 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. Сравняване на комбинация родител-дете от 2 различни таблици в SQL Server

  2. как да форматирате getdate в YYYYMMDDHHmmSS

  3. Обединете стойностите на редовете в CSV (известен още като GROUP_CONCAT за SQL Server)

  4. Node.js MSSQL tedius ConnectionError:Неуспешно свързване към localhost:1433 - свържете ECONNREFUSED

  5. Как да използвате оператора BETWEEN в SQL Server