2015-03-17 2 views
1

Я хочу выбрать детали пациента, выписанного на 2015-03-16, из таблицы выгрузки и соответствующих им данных о приеме из таблицы приема.Выбор последнего появления строки из таблицы

выпускной стол

enter image description here

приема таблицы

enter image description here

эти две таблицы, которая используется в query.the строке, обозначенной красным, должны быть выбраны с помощью запроса.

Запрос используется:

SELECT a.pat_id, a.pat_name, b.admit_date, b.admit_time, b.diagnosis, 
     b.Dr_name, a.dis_date, a.dis_time 
from discharge_details a , admission_Details b 
where dis_date = Convert(Date, DATEADD(day, -1, GETDATE())) 
    and a.pat_id = b.patient_id 
    and b.Admit_status = 'discharged' 

Выход получен:

enter image description here

Требуемая мощность:

enter image description here

Пожалуйста ... помогите мне с предложением изменить мой запрос.

+0

Там нет присущего _first_ или _последней_ в таблице, так как нет никакого внутреннего порядка. –

ответ

3

Вы можете использовать ROW_NUMBER(), чтобы получить то, что хотите. Так как ваш Admit_Date дает основание полагать, что какая строка может быть первой, а какая последняя, ​​поэтому добавьте order by.

SELECT 
    data.* 
FROM 
    (
     SELECT 
      *, ROW_NUMBER() OVER(PARTITION BY pat_id ORDER BY admit_Date desc) as rn 
     FROM 
      table 
    ) as data 
WHERE 
     data.rn = 1 
ORDER BY data.pat_id 

CREATE TABLE #temp 
(id int,pat_id varchar(200), admit_Date date) 

INSERT into #temp 
values 
(1,'pat_123','2015-03-12'), 
(2,'pat_245','2015-03-16'), 
(3,'pat_123 ','2015-03-16') 

Этот запрос дает мне,

id pat_id  admit_date rn 
    3 pat_123  2015-03-16 1 
    2 pat_245  2015-03-16 1 
+0

этот запрос выбирает первые две строки ..... не последние две строки у меня есть отметка – dheena

+0

Проверьте еще раз, что это дает мне правильный результат для меня. –

+0

ya его работа после добавления инструкции ORDER BY data.pat_id .. – dheena

1

OUTER APPLY s совершенны в сценариях, как это:

SELECT a.pat_id , 
     a.pat_name , 
     b.admit_date , 
     b.admit_time , 
     b.diagnosis , 
     b.Dr_name , 
     a.dis_date , 
     a.dis_time 
FROM discharge_details a 
     OUTER APPLY (SELECT TOP 1 * FROM admission_Details d WHERE a.pat_id = d.patient_id AND d.Admit_status = 'discharged' ORDER BY admit_date desc)b 
WHERE a.dis_date = CONVERT(DATE, DATEADD(DAY, -1, GETDATE())) 
1

Несколько предложений, если я могу:

  1. Объедините поля даты и времени в одно поле datetime. Разделение их таким образом не вызывает никаких проблем. Что делать, если пациент был принят и выписан, а затем повторно принят и выписан в тот же день? Бывает.
  2. Не повторяйте данные пациента в таблице разряда. На самом деле, это даже не должно быть в таблице приема. Там должна быть таблица «Пациенты» и, если на то пошло, таблица «Доктора», которая содержит имена и другие такие атрибуты.
  3. Дайте каждому вход суррогатного первичного ключа. Затем разряд будет содержать одно и то же ключевое значение соответствующего допуска. Таким образом этот разряда определенно подключен к что вход. То, как у вас оно есть, мы делаем немного больше, чем квалифицированное предположение. Не хорошо в базах данных.
  4. Атрибуты, такие как ward_number и ward_type, также должны входить в отдельную таблицу. Что происходит, когда пациенты переходят из одной палаты в другую? Вы обновляете таблицу приема? Плохая форма - вы теряете информацию о том, где был пациент. Вы выпускаете выписку и реадмиссию в новую палату? Слишком много ненужного переполнения базы данных. Особенно, если вы считаете, что делаете все, что только нужно лгать.
  5. Тот же совет для поля Admit_Status.Обновляется ли это каждый раз при изменении статуса? Вы должны отслеживать важные изменения, такие как это, и иметь возможность копировать каждое изменение статуса от первоначального приема до окончательного выписки - не только новый статус, но и когда он был сделан, какой врач одобрил и другую важную информацию.

С учетом этого, как и в случае с таблицами, вы должны соответствовать записи о разряде с последней регистрационной записью для пациента, которая предшествовала выписке, и надеемся, что не было двух допусков на одно и то же день. Если это произойдет, вам нужно будет получить поле времени в игре и что усложняет запрос.

SQL Fiddle

declare 
    @DischargeDate datetime; 
set @DischargeDate = '2015-03-16'; 

select ad.Patient_ID, ad.Patient_Name, ad.Admit_Date, ad.Diagnosis, 
     ad.Dr_Name, dd.Dis_Date 
from Discharge_Details dd 
join Admission_Details ad 
    on ad.Patient_ID = dd.Pat_ID 
    and ad.Admit_Date =(
      select Max(Admit_Date) 
      from Admission_Details 
      where Patient_ID = dd.Pat_ID 
       and Admit_Date < dd.dis_date) 
where dd.Dis_Date >= @DischargeDate 
    and dd.Dis_Date < DateAdd(day, 1, @DischargeDate); 
Смежные вопросы