【问题标题】:need to Help query in sql server 2008需要帮助在sql server 2008中查询
【发布时间】: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。 需要满足几个条件才能获得输出

  1. 病人表admitdate <= startdate来自patientstatus
  2. admitdatestartdate 之间的天数差异必须小于等于 30 天 如果在患者表中找到多条记录,则我们采用min(flag) priority value( order by flag values) 如果在patientstatus 表中找到多条记录,则我们采用min(check) priority value( order by check values) 此逻辑仅实现来自patientstatus=1 和来自patientstatusstatus=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


    【解决方案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
    

    【讨论】:

    • 以上查询未给出预期结果示例表:患者 Patientid |admitdate |status |指导 |标志 1 | 2014--03-25 | 1 | 11 | 2 1 | 2014--04-09 | 1 | 12 | 3 表:患者状态开始日期 |状态 |指南 |检查 1 |2014-04-09 | 2 | 51 |21 预期结果是耐心ID |承认日期 |状态 |指导 |过滤器 1 | 2014--03-25 | 1 | 11 |插入 1 | 2014--04-09 | 1 | 51 |更新
    • 根据您的规则,上述查询是正确的。在您上面提供的示例中,您不可能获得“插入”结果,因为您的日期在 30 天内。根据您的定义,承认日期在开始日期后 30 天内的所有记录都标记为“更新”。这就是我的查询所提供的。
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-04-03
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多