如何在SQL Server中选择满足某些条件的特定前一行
我有一个包含PatientID、Diagnostid和Date列的表。这种情况是,如果患者在一个月内多次来进行相同的诊断,则只有日期差大于或等于3的行才应算作该特定月份的就诊次数 例如:如何在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
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
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实施此功能,它不支持滞后功能:(:(