根据SQL Server中的条件需要帮助

时间:2015-11-20 18:24:06

标签: sql-server sql-server-2008

我对SQL Server有疑问。

patient

pn |  code  |  date      |   doctorcode
---------------------------------------
1  |  10    |2015-02-19  |   100
1  |  10    |2015-02-19  |   101
1  |  10    |2015-02-19  |   102
2  |  10    |2015-02-12  |   101
2  |  10    |2015-02-13  |   102
2  |  10    |2015-02-14  |   103
3  |  10    |2015-02-15  |   103
3  |  10    |2015-02-18  |   104  
3  |  10    |2015-02-26  |   105 

Patientref

pn |  code  |  sdate      |   edate      | Status
-------------------------------------------------
1  |  10    |2015-02-13   |   2015-02-19 |  1
1  |  10    |2015-02-19   |   2015-03-24 |  2
1  |  10    |2015-04-28   |   2015-05-08 |  4
2  |  10    |2015-02-08   |   2015-02-19 |  4
2  |  10    |2015-02-09   |   2015-02-19 |  2
2  |  10    |2015-02-10   |   2015-02-19 |  2
2  |  10    |2015-02-11   |   2015-02-18 |  1
3  |  10    |2015-02-10   |   2015-02-17 |  4
3  |  10    |2015-02-10   |   2015-02-17 |  3
3  |  10    |2015-02-11   |   2015-02-18 |  3
2  |  10    |2015-04-10   |   2015-05-19 |  2
3  |  10    |2015-02-11   |   2015-02-18 |  1
3  |  10    |2015-02-26   |   2015-03-18 |  1

在这里,我们需要考虑sdate表的edatepatientrefs之间的患者日期,然后我们需要按顺序考虑最高status值(对于例如,顺序中的最高值 - 2是第一高,4是第二高,3是第三高,1是第四高值

如果日期介于具有相同状态值的多个不同sdateedate之间,那么我们需要考虑最新的sdate值,并且从整个记录中我们需要提取该值值。

例子:患者

pn |  code  |  date      |   doctorcode
2  |  10    |2015-02-12  |   101
2  |  10    |2015-02-13  |   102
2  |  10    |2015-02-14  |   103

表:Patientref:

pn |  code  |  sdate      |   edate      | Status
2  |  10    |2015-02-08   |   2015-02-19 |  4
2  |  10    |2015-02-09   |   2015-02-19 |  2
2  |  10    |2015-02-10   |   2015-02-19 |  2
2  |  10    |2015-02-11   |   2015-02-18 |  1

此处,pn=2值的日期介于patientref表的sdateedate之间。然后我们给出最高值状态为2,状态2值有两个记录,然后我们去max sdate(最新sdate)。那么此pn=2最新日期为2015-02-10,我们需要检索相应的edatestatus值。

基于此,所需的输出如下:

pn |  code  |  date      |   doctorcode | sdate     |edate      |status
1  |  10    |2015-02-19  |   100        |2015-02-19 |2015-03-24 | 2
1  |  10    |2015-02-19  |   101        |2015-02-19 |2015-03-24 | 2
1  |  10    |2015-02-19  |   102        |2015-02-19 |2015-03-24 | 2
2  |  10    |2015-02-12  |   101        |2015-02-10 |2015-02-19 | 2
2  |  10    |2015-02-13  |   102        |2015-02-10 |2015-02-19 | 2
2  |  10    |2015-02-14  |   103        |2015-02-10 |2015-02-19 | 2
3  |  10    |2015-02-15  |   103        |2015-02-10 |2015-02-17 | 4
3  |  10    |2015-02-18  |   104        |2015-02-11 |2015-02-18 | 3
3  |  10    |2015-02-26  |   105        |2015-02-26 |2015-03-18 | 1

我试过这样:

select  
    a.pn, a.code, a.doctorcode, a.date,
    b.sdate, b.edate, b.status
from   
    patient a
left join 
    (select 
         b.pn, b.code, b.sdate, b.edate,
         row_number() over (partition by pn, org
                            order by case when status=2 then 1 when status=4 then 2  when status=3 then 3 when status=1 then 4 end desc,sdate desc) as rn
    from patientref) b on a.pn = b.pn and a.code = b.code 
                       and a.rn = 1
                       and a.date between  b.sdate and b.edate 

但它没有给出预期的结果。如何编写查询以在SQL Server中实现此任务?

1 个答案:

答案 0 :(得分:1)

首先,为了处理状态排序,您应该在系统中有一个表格,显示如何对它们进行排序。这只是一个具有状态ID的表和一个显示排序优先级的排序顺序列。但是,对于您的查询,您只需创建一个表变量来管理它。

try {
    Class clazz = Class.forName(command);
    InputClazz input = (InputClazz) clazz.newInstance();
    input.execute();
} catch (ClassNotFoundException ex) {    
}

然后您可以使用CROSS APPLY查询您的患者表并使用来自您的patientref表的最高优先级记录:

declare @statuses table
([status] int,
sort_order int)

insert into @statuses ([status], sort_order) values (2,0);
insert into @statuses ([status], sort_order) values (4,1);
insert into @statuses ([status], sort_order) values (3,2);
insert into @statuses ([status], sort_order) values (1,3);