У меня вопрос о 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?
Почему бы вам не попробовать разбив задачу на более мелкие запросы и поставить их в временные таблицы –
HI пожалуйста, вы можете дать некоторые идеи, чтобы разделить эту логику в временную таблицу – balu