Sql 如何仅包括下一行在12小时内的行,并进行相应的排名

Sql 如何仅包括下一行在12小时内的行,并进行相应的排名,sql,sql-server,tsql,sql-server-2012,rank,Sql,Sql Server,Tsql,Sql Server 2012,Rank,根据时间戳,我们试图在SQL中只包含下一行在12小时内的行。除此之外,我们还需要对行进行排序,以便识别初始联系人,然后是时间范围内的联系人数量 不幸的是,我们不能只在12小时内寻找最小-最大值,因为日期范围可能更长,但联系人之间的时间只能是12小时。一个人可能在整个日期范围内有多个联系人,并且初始联系人有一些特定于业务的要求,请参见下面SQL中的InitialCall cte 目前使用的SQL: set nocount on; set transaction isolation level re

根据时间戳,我们试图在SQL中只包含下一行在12小时内的行。除此之外,我们还需要对行进行排序,以便识别初始联系人,然后是时间范围内的联系人数量

不幸的是,我们不能只在12小时内寻找最小-最大值,因为日期范围可能更长,但联系人之间的时间只能是12小时。一个人可能在整个日期范围内有多个联系人,并且初始联系人有一些特定于业务的要求,请参见下面SQL中的InitialCall cte

目前使用的SQL:

set nocount on;
set transaction isolation level read uncommitted;
set datefirst 1;
---------------------------------------------------------------------------------------
declare @FromDate as datetime = '2017-01-30T00:00:00';
declare @ToDate as datetime = '2017-02-05T23:59:59';
---------------------------------------------------------------------------------------
with [InitialCalls] as 
(
    select  
        d.PatientRef,
        d.CaseRef,
        d.PathwaysStartDate as [StartDate],
        d.PathwaysFinishDate as [FinishDate]
    from dbo.[111Data] as [d]
    where d.PathwaysStartDate between @FromDate and @ToDate
        and (d.MDSSpeaktoPrimaryCareService = 1 or d.MDSContactPrimaryCareService = 1) 
        and d.PathwaysDxCode in ('Dx05','Dx06','Dx07','Dx08','Dx11','Dx110','Dx1111','Dx116','Dx117','Dx12','Dx13','Dx14','Dx15','Dx17','Dx18','Dx19','Dx20','Dx21','Dx61','Dx80','Dx85','Dx86','Dx87','Dx93','Dx93')
        and d.PathwaysFinalTriage = 1
        and d.PathwaysAbandonedTriage = 0
        and d.ReferralCategory not in ('All Services Rejected','Unsuccessful Lookup','No DoS Selected')
),
[AllCalls] as 
(
    select distinct
        count(d.CaseRef) over (partition by d.PatientRef) as [CaseVol],
        d.PatientRef,
        d.CaseRef,
        d.PathwaysStartDate as [StartDate],
        d.PathwaysFinishDate as [FinishDate]
    from dbo.[111Data] as [d]
        inner join [InitialCalls] as [ic] on ic.PatientRef = d.PatientRef
    where d.PathwaysStartDate between ic.StartDate and dateadd(hour,12, ic.StartDate)
        and d.PathwaysFinalTriage = 1
        and d.PathwaysAbandonedTriage = 0
        and d.PatientRef = 'A3E14866-4DD5-4001-AF63-21819F49B401'
)
select 
    rank() over (partition by ac.PatientRef order by ac.StartDate) as [Rank],
    ac.PatientRef,
    ac.CaseRef,
    ac.StartDate,
    ac.FinishDate,
    lag(ac.FinishDate) over (partition by ac.PatientRef order by ac.FinishDate asc) as [PreviousRowFinishDate],
    datediff(hour, lag(ac.FinishDate) over (partition by ac.PatientRef order by ac.FinishDate asc), ac.StartDate) as [HoursDifference]
from [AllCalls] as [ac]
where ac.CaseVol > 1
电流输出:

预期产出:

在本例中,我们不希望包括第一行,因为这在12小时内没有后续联系人,然后对每个重复联系人的实例进行排序。这样我们就可以跟踪有多少人打电话询问某个特定问题,然后打电话跟进

编辑-创建表和修改SQL

最终编辑-在Vladimir的帮助下回答


一般来说,你可以这样做

...WHERE EXISTS(
              SELECT 1 FROM dbo.[111Data] as [d2] 
                                  WHERE D2.StartDate BETWEEN 
                                        D1.StartDate 
                                        AND DATEADD(hour, 12, D1.StartDate)
                )
要在12小时内选择这样一条记录并在其后添加一条记录,您是否尝试过类似的操作


我不确定你所说的关于在时间范围内排名和计数的第二部分是什么意思,你可以使用子查询来完成它

抱歉,我犯了一个错误,您需要将正在审查的记录从数据库中排除

...WHERE EXISTS(
          SELECT 1 FROM dbo.[111Data] as [d2] 
                              WHERE D2.StartDate >
                                    D1.StartDate 
                                    AND D2.StartDate <= DATEADD(hour, 12, D1.StartDate)
            )
样本数据

质疑

结果

一步一步地运行查询,逐个cte并检查中间结果以了解其工作原理

CTE_Prev返回上一行的PrevStart。如果它是患者的第一行,则为空,因此我将其设置为常数2001-01-01

如果两行之间的间隔超过12小时,CTE_Markers将返回GapiLargeMarker设置为1。它用1标记新序列开始的行

CTE_Sequences使用running total填充序列号SeqNumber

CTE_Ranks计算每个序列中的行号rnk以及每个序列中SeqLength的行数


最后,我们只返回那些包含超过1行的序列。

对于这样的问题,将您的数据/问题简化为一个示例非常有用,人们可以使用该示例快速复制您的问题并提供解决方案。这里的组合中似乎有很多额外的列和值可能与您的潜在问题无关,这将使人们更难回答。此外,如果您能够提供创建表脚本,也许可以填充一些具有代表性的示例临时表,并在其中放入一些数据,这可能很有用。我已经编辑了问题,将表创建、数据和使用该问题的脚本版本包括在内,而不使用其他特定于表的筛选。我已经为SQL Server版本添加了一个标记,因为您使用了LAG函数。它是在SQL Server 2012中添加的。感谢您的建议,但它似乎给出了与现有SQL相同的结果。我不认为,您需要从中排除正在检查的记录,或者通过排除唯一键,或者使用>时间。这就是我要做的。但是,对于其他实例,这不包括排名1-我要么在顶部有错误包含的行,要么缺少前两行。我需要排除案例参考DB79C49E-938C-4C40-B48E-3389D9339759并保留4BFA4E3B-D313-4777-A290-3C13601D5C95我不确定“失去排名1”是什么意思-我不清楚你需要的排名概念-如果你有00:00、12:10、12:45、15:00-那么你会想排除00:00,但是显示的3行会有什么等级呢?如果您查看预期的输出,我需要丢失第1行,保留第2行。您的选项是我已经考虑过的选项,但它丢失了第1行和第2行。秩1指的是每个初始联系人在所需输出中都应该是秩1,但会被此解决方案过滤掉。谢谢,这已经用了一些非常小的调整。我已经编辑了这个问题,以包括我们正在使用的最终版本。
...WHERE EXISTS(
              SELECT 1 FROM dbo.[111Data] as [d2] 
                                  WHERE D2.StartDate BETWEEN 
                                        D1.StartDate 
                                        AND DATEADD(hour, 12, D1.StartDate)
                )
...WHERE EXISTS(
          SELECT 1 FROM dbo.[111Data] as [d2] 
                              WHERE D2.StartDate >
                                    D1.StartDate 
                                    AND D2.StartDate <= DATEADD(hour, 12, D1.StartDate)
            )
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');
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;
+--------------------------------------+--------------------------------------+-------------------------+-------------------------+-------------------------+------------------+-----------+-----+-----------+
|               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 |
+--------------------------------------+--------------------------------------+-------------------------+-------------------------+-------------------------+------------------+-----------+-----+-----------+