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

时间:2019-04-11 14:17:51

标签: sql sql-server

我有一个包含PatientID,DiagnosisID和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
  1. 2018年12月的访问次数应计为1

  2. DateDiff> = 3在第一行和第二行(12月29日至1月1日)之间,因此是1月1日 是有效的访问。

  3. DateDiff> = 3在第二行和第三行之间(1月1日至1月5日),因此是第5行 Jan是有效的访问。

  4. DateDiff <= 3在第3行和第4行(1月5日至1月6日)之间,因此是第6行 Jan不是有效的访问。

  5. DateDiff <= 3,位于第4行和第5行(1月6日至1月8日)之间,因此是第8行 应该将1月与之前的有效访问(即1月5日)进行比较 datediff> = 3,因此1月8日是新的有效访问,因此前面的行应 与1月8日进行比较。

  6. DateDiff <= 3在第5行和第6行(1月8日至1月9日)之间,因此是第9行 Jan不合法。

  7. DateDiff> = 3在第6行和第7行(1月13日至1月9日)之间,因此是第13行 Jan是新的有效访问。

  8. DateDiff> = 3在第7行和第8行(1月31日至1月13日)之间,因此是第31行 Jan是新的有效访问。

  9. DateDiff <= 3,位于第8行和第9行(2月1日至1月31日)之间,因此为1st 2月的访问无效。

  10. DateDiff> = 3在第9行和第10行(2月7日至2月1日)之间,因此是第7行 2月是次有效访问。

最终输出:

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,如果此条件为假,则当前行应为 与之前的有效访问进行比较。

我已经尝试过使用递归CTE来实现它,但是我无法 找到终止条件,即比较应该在前一个条件处停止 有效的访问。

1 个答案:

答案 0 :(得分:0)

使用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)