[英]need to Help query in sql server 2008
桌子: 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)
表2: 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)
本实施逻辑仅status=1
从patient
和status=2
从patientstatus
保持状态值没有必要考虑 基于上面的两个表,我想像下面这样输出。
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中实现此任务。
declare @patient table ( patientid int, admitdate date , [status] int , [guid] int ,[flag] int)
declare @patientstatus table ( patientid int , startdate date , [status] int ,[guid] int,[check] 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)
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)
select distinct p.patientid,p.admitdate,p.[status] as patient_status,
case
when DATEDIFF(day,p.admitdate,s.startdate) < 30 then 'Update'
else 'Insert'
end as filter,
case
when DATEDIFF(day,p.admitdate,s.startdate) < 30 then s.[guid]
else p.[guid]
end as [guid]
from(
select patientid, admitdate, [status], [guid], min([flag]) as [flag]
from @patient p
where [status] = 1
group by patientid,admitdate,[status], [guid]
) AS p
inner join (
select patientid ,startdate ,[status] ,[guid],min([check]) as [check]
from @patientstatus
where [status] = 2
group by patientid ,startdate ,[status] ,[guid]
) AS s on p.patientid=s.patientid
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.