繁体   English   中英

需要帮助SQL Server 2008中的查询

[英]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。 需要满足一些条件才能获得输出

  1. 患者台admitdate <= startdatepatientstatus
  2. 天之间differnce admitdatestartdate和天差必须我比等于30天更少,如果在病人表中找到多条记录,然后我们就min(flag) priority value( order by flag values)如果发现多条记录patientstatus表接下来我们就来min(check) priority value( order by check values)本实施逻辑仅status=1patientstatus=2patientstatus保持状态值没有必要考虑

基于上面的两个表,我想像下面这样输出。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM