需要在SQLServer2008中进行帮助查询
表格:需要在SQLServer2008中进行帮助查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,表格:患者 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
患者
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:患者状态
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=p.admitdate
ps.status=2
由ps订购(支票)作为ps
其中p.status=1
p.rowno=1
但上述查询未给出预期结果。请告诉我如何编写查询以在sql server中完成此任务。declare@patient table(patientid int、admitdate date、[status]int、[guid]int、[flag]int)
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
声明@patientstatus表(patientid int,startdate date,[status]int,[guid]int,[check]int)
插入@patient(patientid,admitdate,[status],[guid],标志)
价值观
(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)
插入@patientstatus(patientid,startdate,[status],[guid],[check])
价值观
(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)
选择不同的p.patientid、p.admitdate、p.[状态]作为患者状态,
案例
当DATEDIFF(day,p.admitdate,s.startdate)<30时,则“更新”
其他“插入”
作为过滤器结束,
案例
当DATEDIFF(day,p.admitdate,s.startdate)<30时,则s.[guid]
else p[guid]
结束为[guid]
从(
选择patientid、admitdate、[status]、[guid]、min([flag])作为[flag]
来自@patient p
其中[状态]=1
按patientid、admitdate、[状态]、[guid]分组
)AS p
内连接(
选择patientid、startdate、[status]、[guid]、min([check])作为[check]
来自@patientstatus
其中[状态]=2
按patientid、startdate、[status]、[guid]分组
)p.patientid上的s=s.patientid
上述查询未给出预期结果示例表:patient patientid | admitdate | status | guid | flag 1 | 2014--03-25 | 1 | 11 | 2 1 | 2014--04-09 | 1 | 12 | 3表:patientstatus patientid | startdate | status | status | guid | guid | check | check 1 | 2014-04-04-09 | 2 | 51 | 21预期结果admitdate | status | guid | Filter 1 | 2014--03-25 | 1 | 11 | insert 1 | 2014--04-09 | 1 | 51 | update根据您的规则,上述查询是正确的。在上面提供的示例中,您不可能得到“插入”结果,因为您的日期在30天之内。根据您的定义,所有录取日期在开始日期30天内的记录都标记为“更新”。这就是我的疑问。
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
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