Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Выборка без одинаковых записей [MS sql server2005]


Автор: GUZstav 22.5.2009, 07:49
Доброго времени суток.
Делаю арм для учета пациентов. Хочу сделать запрос на выборку пациентов по заболеванию. Но каждый пациент может иметь несколько диагнозов поставленных в разное время. 
Таблицы:
Есть три таблицы: 2 главные, 1 ассоциативная
http://pic.ipicture.ru/uploads/090522/mrUtT44Avy.jpg



Запрос:
SELECT        T_karta.id, T_karta.surname, T_karta.name, T_karta.last_name, T_karta.data_rozh,T_diagnos.data,T_diagnos.diagnos
FROM            T_karta INNER JOIN
                         T_kar_diag ON T_karta.id = T_kar_diag.id_bol INNER JOIN
                         T_diagnos ON T_kar_diag.id_diag = T_diagnos.id 
WHERE        (T_diagnos.diagnos = ?)
ORDER BY T_karta.surname, T_diagnos.data DESC

Но этот запрос выбирает все записи, а мне надо, чтобы для одного человека - один диагноз с самой поздней датой. 
Заранее благодарю.


Автор: DimW 22.5.2009, 08:42
Цитата(GUZstav @  22.5.2009,  07:49 Найти цитируемый пост)
чтобы для одного человека - один диагноз с самой поздней датой. 


1)
Код

select *
  from (SELECT T_karta.id
              ,T_karta.surname
              ,T_karta.name
              ,T_karta.last_name
              ,T_karta.data_rozh
              ,T_diagnos.data
              ,T_diagnos.diagnos
              ,row_number() over(partition by T_karta.id order by T_diagnos.data desc) num
          FROM T_karta
         INNER JOIN T_kar_diag ON T_karta.id = T_kar_diag.id_bol
         INNER JOIN T_diagnos ON T_kar_diag.id_diag = T_diagnos.id)
 where num = 1


2)
Код

SELECT k.id
       ,k.surname
       ,k.name
       ,k.last_name
       ,k.data_rozh
       ,d.data
       ,d.diagnos
   FROM T_karta k
  INNER JOIN T_kar_diag kd ON k.id = kd.id_bol
  INNER JOIN T_diagnos d ON kd.id_diag = d.id
  where d.data = (select max(d2.data)
                    from T_kar_diag kd2
                        ,T_diagnos d2
                   where kd2.id_diag = d2.id 
                     and kd2.id_bol = k.id)


поправил второй запрос

Автор: GUZstav 24.5.2009, 11:58
Спасибо, выручил. Еще вопрос: если для d2.data задать диапазон between(чтобы юзер мог посмотреть стат за период времени), его ставить сюда:
select max(d2.data)
                    from T_kar_diag kd2
                        ,T_diagnos d2
                   where kd2.id_diag = d2.id 
                     and kd2.id_bol = k.id and max(d2.data) between ? and ?)

Автор: DimW 25.5.2009, 07:32
Цитата(GUZstav @  24.5.2009,  11:58 Найти цитируемый пост)
Еще вопрос: если для d2.data задать диапазон between(чтобы юзер мог посмотреть стат за период времени), его ставить сюда:

если требуется показать последний диагноз за указанный промежуток времени то так:
Код

  where d.data = (select max(d2.data)
                    from T_kar_diag kd2
                        ,T_diagnos d2
                   where kd2.id_diag = d2.id 
                     and kd2.id_bol = k.id
                     and d2.data between :p_start_date and :p_end_date)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)