我对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
表的edate
和patientrefs
之间的患者日期,然后我们需要按顺序考虑最高status
值(对于例如,顺序中的最高值 - 2是第一高,4是第二高,3是第三高,1是第四高值
如果日期介于具有相同状态值的多个不同sdate
和edate
之间,那么我们需要考虑最新的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表的sdate
和edate
之间。然后我们给出最高值状态为2,状态2值有两个记录,然后我们去max sdate(最新sdate)。那么此pn=2
最新日期为2015-02-10
,我们需要检索相应的edate
和status
值。
基于此,所需的输出如下:
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中实现此任务?
答案 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);