【问题标题】:How to select a specific previous row which meet some condition in SQL Server如何在 SQL Server 中选择满足某些条件的特定上一行
【发布时间】:2019-09-02 05:17:45
【问题描述】:

我有一张包含 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 在第 1 行和第 2 行之间(12 月 29 日和 1 月 1 日)因此是 1 月 1 日 是有效的访问。

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

  4. DateDiff

  5. DateDiff=3 所以 1 月 8 日是新的有效访问,前面的行应该 与 1 月 8 日进行比较。

  6. DateDiff

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

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

  9. DateDiff

  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 来实现它,但我无法做到 找到一个终止条件,即比较应该在之前停止 有效访问。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用 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 日 - 上一行。提问者说这需要与之前的 VALID 行 - 第 5 行进行比较。不是这个问题的正确答案
    • 感谢您的回复。对不起,我忘了提到我们需要为不支持 Lag 功能的 2008 R2 实现它:( :(
    猜你喜欢
    • 2012-03-29
    • 2014-02-18
    • 1970-01-01
    • 2014-07-10
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多