Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在SQLServer2008中进行帮助查询_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

需要在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