Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhóm các hàng cách nhau dưới 15 ngày và ấn định ngày tối thiểu / tối đa

Như đã đề cập trong phần nhận xét, bạn có thể sử dụng LAG chức năng này. Ý tưởng cơ bản là chỉ định giá trị 0/1 cho mỗi hàng:nếu nó nằm trong vòng 15 ngày kể từ hàng trước đó thì 0 khác 1. Sau đó sử dụng SUM() OVER () để chuyển đổi số 1 và số 0 thành số có thể được sử dụng để nhóm.

Lưu ý rằng điều này có thể nhóm các phạm vi ngày dài hơn với nhau, ví dụ:01-01 , 01-11 , 01-21 , 02-0102-11 sẽ được nhóm lại với nhau mặc dù ngày đầu tiên và ngày cuối cùng cách nhau hơn 15 ngày.

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

Bản trình diễn trên 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. Làm cách nào để kích hoạt trình kích hoạt TRƯỚC khi xóa trong T-SQL 2005?

  2. Cách tìm số nhận dạng duy nhất tối ưu trong bảng trong SQL Server:sp_special_columns

  3. Các cải tiến của Service Broker trong SQL Server 2016

  4. Giá trị trả về từ thi hành (@sql)

  5. Thời gian thực thi ALTER COLUMN