2015-11-20 3 views
0

У меня вопрос о SQL Server.Нужна помощь на основе условий в 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 - четвертым Ghest значение)

Если дата падает между несколькими различными 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 значения имеют даты, которые попадают между sdate и edate из patientref таблицы. Затем мы указываем, что статус с самыми высокими значениями равен 2, а значения состояния 2 имеют две записи, затем мы переходим к max sdate (последняя версия sdate). Тогда это pn=2 последние sdates является 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

Почему бы вам не попробовать разбив задачу на более мелкие запросы и поставить их в временные таблицы –

+0

HI пожалуйста, вы можете дать некоторые идеи, чтобы разделить эту логику в временную таблицу – balu

ответ

1

Во-первых, для обработки статуса сортировки вы действительно должны иметь таблицу в вашей системе, показывая, как они могут быть отсортированы. Это будет просто таблица, в которой есть идентификатор статуса и столбец порядка сортировки, показывающий приоритет сортировки. Однако для вашего запроса вы можете просто создать переменную таблицы для ее управления.

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); 

Затем вы можете использовать CROSS APPLY для запроса таблицу пациента и использовать наивысший приоритет записи из вашего patientref таблицы:

select 
p.pn, 
p.code, 
p.date, 
p.doctorcode, 
ca.sdate, 
ca.edate, 
ca.status 
from patient p 
cross apply 
    (select 
    top 1 
    pr.pn, 
    pr.code, 
    pr.sdate, 
    pr.edate, 
    pr.status 
    from patientref pr 
    inner join @statuses s on pr.status = s.status 
    where pr.pn = p.pn 
    and pr.code = p.code 
    and p.date between pr.sdate and pr.edate 
    order by s.sort_order, pr.sdate desc) as ca 
+0

HI данного запроса придет ожидаемый результат. Я попытался, как показано ниже выберите p.pn, p.code.p.date, p.doctorcode, ca.sdate, ca.edate, ca.status от пациента р croos применяются (выберите TOP1 pr.pn, pr.code, пр. SDATE, pr.edate, pr.status из patientref пр где pr.pn = p.pn и pr.code = p.code и p.date между pr.sdate и pr.edate порядке случае, когда pr.status = 2, то 1, когда pr.status = 4, затем 2, когда pr.status = 3, затем 3, когда pr.status = 1, затем 4 end desc, pr.sdate). Pr.its работает нормально.возможно ли сделать тот же результат с левым соединением query.if возможно, скажите мне, что запрос. – balu

Смежные вопросы