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

Cách chỉ bao gồm các hàng có hàng sau trong vòng 12 giờ và xếp hạng tương ứng

Dữ liệu mẫu

declare @table as table
(
    [CaseRef] uniqueidentifier,
    [PatientRef] uniqueidentifier,
    [StartDate] datetime,
    [FinishDate] datetime
);

insert into @table
(
    [CaseRef],
    [PatientRef],
    [StartDate],
    [FinishDate]
)
values
('DB79C49E-938C-4C40-B48E-3389D9339759', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 00:22:41', '2017-01-30 00:28:06'),
('4BFA4E3B-D313-4777-A290-3C13601D5C95', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 22:00:46', '2017-01-30 22:10:24'),
('F910D4DE-3CEE-4429-8844-DDE860D08192', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 22:25:49', '2017-01-30 22:27:58'),
('DF28DC91-02E3-47F2-88E0-397C2CBCFE41', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 22:44:11', '2017-01-30 22:53:22'),
('D6964286-8AE7-46AB-8DA5-88A347015C4D', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 22:55:17', '2017-01-30 23:01:57'),
('660B2ED7-B715-4A6C-A92B-D80267C0E4F5', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 23:06:16', '2017-01-30 23:08:28'),
('903AC539-4BB1-44AB-AFDB-D86C13310011', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 23:15:21', '2017-01-30 23:16:02'),
('75B88E5F-4795-4A21-9EA6-3B41CE958250', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 23:28:31', '2017-01-30 23:29:53'),
('DD6A4BD5-EF75-44CE-9309-4C14B2A21FF4', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 23:45:42', '2017-01-30 23:46:13'),
('518319BA-0EDE-46D8-B0B7-E8CEB233DEDF', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-30 23:54:02', '2017-01-31 00:03:13'),
('FB5A5A54-E580-40F2-94FD-64E20EA5C4DD', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-31 16:13:01', '2017-01-31 16:21:02'),
('8A4FD0C3-59BF-43AB-A829-F2396D6FB26A', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-01-31 18:26:14', '2017-01-31 18:39:20'),
('8CB94AF1-9664-4081-A2E1-271ED16B147B', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-02-01 08:10:41', '2017-02-01 08:18:18'),
('0DC6B68B-0458-48DF-B286-C1A978653981', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-02-01 15:40:45', '2017-02-01 15:48:24'),
('DB239857-6870-4AD9-8149-69ED6151CCB2', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-02-02 16:54:40', '2017-02-02 17:10:27'),
('938CCFF4-66C9-48B1-BDB7-D9144D2BD522', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-02-02 19:29:18', '2017-02-02 19:30:14'),
('1EC730D0-AF85-45BF-BD06-12B23124151F', 'A3E14866-4DD5-4001-AF63-21819F49B401', '2017-02-02 19:43:28', '2017-02-02 19:47:12');

Truy vấn

WITH
CTE_Prev
AS
(
    SELECT
        CaseRef
        ,PatientRef
        ,StartDate
        ,FinishDate
        ,ISNULL(LAG(StartDate) OVER (PARTITION BY PatientRef ORDER BY StartDate),
            '2000-01-01') AS PrevStart
    FROM @Table AS T
)
,CTE_Markers
AS
(
    SELECT
        CaseRef
        ,PatientRef
        ,StartDate
        ,FinishDate
        ,PrevStart
        ,CASE WHEN (DATEDIFF(hour, PrevStart, StartDate) >= 12) 
            THEN 1 ELSE 0 END AS GapIsLargeMarker
    FROM CTE_Prev
)
,CTE_Sequences
AS
(
    SELECT
        CaseRef
        ,PatientRef
        ,StartDate
        ,FinishDate
        ,PrevStart
        ,GapIsLargeMarker
        ,SUM(GapIsLargeMarker) OVER (PARTITION BY PatientRef ORDER BY StartDate 
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SeqNumber
    FROM CTE_Markers
)
,CTE_Ranks
AS
(
    SELECT
        CaseRef
        ,PatientRef
        ,StartDate
        ,FinishDate
        ,PrevStart
        ,GapIsLargeMarker
        ,SeqNumber
        ,ROW_NUMBER() OVER (PARTITION BY PatientRef,SeqNumber ORDER BY StartDate) AS rnk
        ,COUNT(*) OVER (PARTITION BY PatientRef, SeqNumber) AS SeqLength
    FROM CTE_Sequences
)
SELECT
    CaseRef
    ,PatientRef
    ,StartDate
    ,FinishDate
    ,PrevStart
    ,GapIsLargeMarker
    ,SeqNumber
    ,rnk
    ,SeqLength
FROM CTE_Ranks
WHERE SeqLength > 1
ORDER BY PatientRef, StartDate;

Kết quả

+--------------------------------------+--------------------------------------+-------------------------+-------------------------+-------------------------+------------------+-----------+-----+-----------+
|               CaseRef                |              PatientRef              |        StartDate        |       FinishDate        |        PrevStart        | GapIsLargeMarker | SeqNumber | rnk | SeqLength |
+--------------------------------------+--------------------------------------+-------------------------+-------------------------+-------------------------+------------------+-----------+-----+-----------+
| 4BFA4E3B-D313-4777-A290-3C13601D5C95 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 22:00:46.000 | 2017-01-30 22:10:24.000 | 2017-01-30 00:22:41.000 |                1 |         2 |   1 |         9 |
| F910D4DE-3CEE-4429-8844-DDE860D08192 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 22:25:49.000 | 2017-01-30 22:27:58.000 | 2017-01-30 22:00:46.000 |                0 |         2 |   2 |         9 |
| DF28DC91-02E3-47F2-88E0-397C2CBCFE41 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 22:44:11.000 | 2017-01-30 22:53:22.000 | 2017-01-30 22:25:49.000 |                0 |         2 |   3 |         9 |
| D6964286-8AE7-46AB-8DA5-88A347015C4D | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 22:55:17.000 | 2017-01-30 23:01:57.000 | 2017-01-30 22:44:11.000 |                0 |         2 |   4 |         9 |
| 660B2ED7-B715-4A6C-A92B-D80267C0E4F5 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 23:06:16.000 | 2017-01-30 23:08:28.000 | 2017-01-30 22:55:17.000 |                0 |         2 |   5 |         9 |
| 903AC539-4BB1-44AB-AFDB-D86C13310011 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 23:15:21.000 | 2017-01-30 23:16:02.000 | 2017-01-30 23:06:16.000 |                0 |         2 |   6 |         9 |
| 75B88E5F-4795-4A21-9EA6-3B41CE958250 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 23:28:31.000 | 2017-01-30 23:29:53.000 | 2017-01-30 23:15:21.000 |                0 |         2 |   7 |         9 |
| DD6A4BD5-EF75-44CE-9309-4C14B2A21FF4 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 23:45:42.000 | 2017-01-30 23:46:13.000 | 2017-01-30 23:28:31.000 |                0 |         2 |   8 |         9 |
| 518319BA-0EDE-46D8-B0B7-E8CEB233DEDF | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-30 23:54:02.000 | 2017-01-31 00:03:13.000 | 2017-01-30 23:45:42.000 |                0 |         2 |   9 |         9 |
| FB5A5A54-E580-40F2-94FD-64E20EA5C4DD | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-31 16:13:01.000 | 2017-01-31 16:21:02.000 | 2017-01-30 23:54:02.000 |                1 |         3 |   1 |         2 |
| 8A4FD0C3-59BF-43AB-A829-F2396D6FB26A | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-01-31 18:26:14.000 | 2017-01-31 18:39:20.000 | 2017-01-31 16:13:01.000 |                0 |         3 |   2 |         2 |
| 8CB94AF1-9664-4081-A2E1-271ED16B147B | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-02-01 08:10:41.000 | 2017-02-01 08:18:18.000 | 2017-01-31 18:26:14.000 |                1 |         4 |   1 |         2 |
| 0DC6B68B-0458-48DF-B286-C1A978653981 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-02-01 15:40:45.000 | 2017-02-01 15:48:24.000 | 2017-02-01 08:10:41.000 |                0 |         4 |   2 |         2 |
| DB239857-6870-4AD9-8149-69ED6151CCB2 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-02-02 16:54:40.000 | 2017-02-02 17:10:27.000 | 2017-02-01 15:40:45.000 |                1 |         5 |   1 |         3 |
| 938CCFF4-66C9-48B1-BDB7-D9144D2BD522 | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-02-02 19:29:18.000 | 2017-02-02 19:30:14.000 | 2017-02-02 16:54:40.000 |                0 |         5 |   2 |         3 |
| 1EC730D0-AF85-45BF-BD06-12B23124151F | A3E14866-4DD5-4001-AF63-21819F49B401 | 2017-02-02 19:43:28.000 | 2017-02-02 19:47:12.000 | 2017-02-02 19:29:18.000 |                0 |         5 |   3 |         3 |
+--------------------------------------+--------------------------------------+-------------------------+-------------------------+-------------------------+------------------+-----------+-----+-----------+

Chạy truy vấn từng bước, từng bước và kiểm tra các kết quả trung gian để hiểu cách hoạt động của nó.

CTE_Prev trả về PrevStart từ hàng trước. Nếu đó là hàng đầu tiên dành cho bệnh nhân thì đó là NULL , vì vậy tôi đặt nó thành một hằng số 2001-01-01 .

CTE_Markers trả về GapIsLargeMarker đặt thành 1 nếu khoảng cách giữa hai hàng hơn 12 giờ. Nó đánh dấu bằng 1 những hàng nơi bắt đầu một "trình tự" mới.

CTE_Sequences điền các số thứ tự SeqNumber sử dụng tổng số đang chạy.

CTE_Ranks tính toán số hàng (rnk ) trong mỗi trình tự và bao nhiêu hàng (SeqLength ) theo từng trình tự.

Cuối cùng, chúng tôi chỉ trả lại những chuỗi có nhiều hơn 1 hàng trong đó.



  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 thế nào để giải quyết SqlConnection đang bị đóng từ bên trong ExecuteReader?

  2. 50 câu hỏi phỏng vấn máy chủ SQL hàng đầu bạn phải chuẩn bị vào năm 2022

  3. Làm mới bảng máy chủ SQL với ít gián đoạn hơn bằng cách sử dụng chuyển đổi phân vùng

  4. Di chuyển cột DateTime của SQL Server sang DateTimeOffset

  5. Truy vấn chạy chậm chỉ trên máy của tôi