【发布时间】:2016-04-05 11:29:51
【问题描述】:
表:patient
create table patient ( patientid int, admitdate date , status int , guid int ,flag int)
insert into patient (patientid,admitdate,status,guid,flag)
values
(1,'2013--09-25', 1 ,10,1),
(1,'2014--03-25', 1 ,11,2),
(1,'2014--04-09', 1 ,12,3),
(1,'2015--01-22', 1 ,13,4),
(2,'2015--12-13', 1 ,14,5),
(2,'2014--10-10', 1 ,15,6),
(3,'2015--10-11', 1 ,16,7),
(3,'2015--12-27', 1 ,17,8),
(3,'2015--01-01', 6 ,18,9),
(4,'2011--01-01', 1 ,19,10),
(4,'2011--01-01', 1 ,20,11)
table2:patientstatus
create table patientstatus ( patientid int , startdate date , status int ,guid int,check int)
insert into patientstatus (patientid ,startdate ,status ,guid,check)
values
(1 ,'2013-10-02',2,50,20),
(1 ,'2014-04-09',2,51,21),
(1 ,'2015-01-30',2,52,22),
(2 ,'2015-12-15',2,53,23),
(2 ,'2015-12-15',2,54,24),
(3 ,'2015-10-11',2,55,25),
(3 ,'2015-10-12',2,56,26),
(4 ,'2011-01-02',2,57,27),
(4 ,'2010-07-02',8,58,28)
两个表都有共同的列 patientid。 需要满足几个条件才能获得输出
- 病人表
admitdate <= startdate来自patientstatus -
admitdate和startdate之间的天数差异必须小于等于 30 天 如果在患者表中找到多条记录,则我们采用min(flag) priority value( order by flag values)如果在patientstatus表中找到多条记录,则我们采用min(check) priority value( order by check values)此逻辑仅实现来自patient的status=1和来自patientstatus的status=2保持状态值无需考虑
基于以上两个表,我想要如下所示的输出。
patientid | admitdate | status | guid | Filter
1 | 2013-09-25 | 1 | 50 | update
1 | 2014-03-25 | 1 | 11 | insert
1 | 2014-04-09 | 1 | 51 | update
1 | 2015-01-22 | 1 | 52 | update
2 | 2015-12-13 | 1 | 53 | update
2 | 2014-10-10 | 1 | 15 | insert
3 | 2015-10-11 | 1 | 55 | update
3 | 2015-12-27 | 1 | 17 | insert
4 | 2011-01-01 | 1 | 27 | update
4 | 2011-01-01 | 1 | 20 | insert
我尝试如下:
SELECT p.patientid , p.admitdate, p.status,
CASE WHEN datediff(day, p.admitdate, ps.startdate) < 30
THEN 'Update'
ELSE 'Insert'
END AS filter,
CASE WHEN datediff(day, p.admitdate, ps.startdate) < 30
THEN ps.guid
ELSE p.guid
END AS guid
FROM (SELECT , row_number() OVER(PARTITION BY patientid ORDER BY flag) AS rowno
FROM patient) AS p
OUTER APPLY (SELECT TOP 1 ps.*
FROM patientstatus ps
WHERE ps.patientid=p.patientid
AND ps.startdate >= p.admitdate
AND ps.status = 2
ORDER BY ps.check) AS ps
WHERE p.status = 1
AND p.rowno = 1
但上述查询未给出预期结果。请告诉我如何编写查询以在 sql server 中完成此任务。
【问题讨论】:
标签: sql sql-server sql-server-2008