如何在SQL Server中选择满足某些条件的特定前一行

如何在SQL Server中选择满足某些条件的特定前一行,sql,sql-server,Sql,Sql Server,我有一个包含PatientID、Diagnostid和Date列的表。这种情况是,如果患者在一个月内多次来进行相同的诊断,则只有日期差大于或等于3的行才应算作该特定月份的就诊次数 例如: RowNumber PatientID DiagnosisID DiagnosisDate 1 P1 D1 29-12-2018 2 P1 D1 01-01-2019 3 P1

我有一个包含PatientID、Diagnostid和Date列的表。这种情况是,如果患者在一个月内多次来进行相同的诊断,则只有日期差大于或等于3的行才应算作该特定月份的就诊次数

例如:

RowNumber PatientID DiagnosisID DiagnosisDate
1            P1         D1        29-12-2018
2            P1         D1        01-01-2019
3            P1         D1        05-01-2019
4            P1         D1        06-01-2019
5            P1         D1        08-01-2019
6            P1         D1        09-01-2019
7            P1         D1        13-01-2019
8            P1         D1        31-01-2019
9            P1         D1        01-02-2019
10           P1         D1        07-02-2019
  • 2018年12月的访问次数应计为1

  • DateDiff>=第1行和第2行之间的3(12月29日和1月1日),因此为1月1日 这是一次有效的访问

  • DateDiff>=3,介于第2排和第3排之间(1月1日和1月5日),因此为第5排 简的访问是有效的

  • DateDiff=3,介于第7排和第8排之间(1月31日和1月13日),因此为31 简是新的有效访问

  • DateDiff=3,介于第9行和第10行之间(2月7日和2月1日),因此为第7行 二月是一次有效的访问

  • 最终输出:

    Dec-2018 visit count = 1 (29th Dec)
    Jan-2019 visit count = 5 (1, 5, 8, 13 & 31st Jan)
    Feb-2019 visit count = 1 ( 7th Feb )
    
    基本上,当前行和上一行之间的Datediff应该更大 大于等于3,如果此条件为false,则当前行应为 与之前的有效访问相比

    我已经尝试过用递归CTE实现它,但是我不能 找到终止条件,即比较应在前一个时间停止
    有效访问。

    使用滞后函数测试DATEDIFF

    WITH test_tab as
    (
    select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
    DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
    from table
    )
    Select * from test_tab ;
    
    过滤器>=3

    WITH test_tab as
        (
        select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
        DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
        from table
        )
        Select * from test_tab WHERE days>=3
    
    按年/月分组

    WITH test_tab as
            (
            select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
            DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
            from table
            )
    Select YEAR(DiagnosisDate) year,Month(DiagnosisDate) montch,Count(RowNumber)
         from test_tab 
        WHERE days>=3
        GROUP BY YEAR(DiagnosisDate) ,Month(DiagnosisDate)
    

    使用LAG函数测试DATEDIFF

    WITH test_tab as
    (
    select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
    DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
    from table
    )
    Select * from test_tab ;
    
    过滤器>=3

    WITH test_tab as
        (
        select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
        DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
        from table
        )
        Select * from test_tab WHERE days>=3
    
    按年/月分组

    WITH test_tab as
            (
            select RowNumber, PatientID, DiagnosisID, DiagnosisDate,
            DATETIFF(day, lag(PlantFK,1,'19900101') OVER (PARTITION BY PatientID, DiagnosisID order by DiagnosisDate),DiagnosisDate) days
            from table
            )
    Select YEAR(DiagnosisDate) year,Month(DiagnosisDate) montch,Count(RowNumber)
         from test_tab 
        WHERE days>=3
        GROUP BY YEAR(DiagnosisDate) ,Month(DiagnosisDate)
    

    这将比较1月8日和1月6日——前一行。询问者说这需要与前一个有效行(第5行)进行比较。这个问题的答案不正确谢谢你的回答。对不起,我忘了提到我们需要为不支持滞后功能的2008 R2实现它:(:(这将1月8日与1月6日进行比较-前一行。询问者说,这需要与前一有效行-第5行进行比较。此问题的答案不正确谢谢您的回答。抱歉,我忘了提及我们需要为2008 R2实施此功能,它不支持滞后功能:(:(