Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка без одинаковых записей [MS sql server2005], выбрать из трех таблиц  
:(
    Опции темы
GUZstav
Дата 22.5.2009, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Доброго времени суток.
Делаю арм для учета пациентов. Хочу сделать запрос на выборку пациентов по заболеванию. Но каждый пациент может иметь несколько диагнозов поставленных в разное время. 
Таблицы:
Есть три таблицы: 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

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


PM MAIL   Вверх
DimW
Дата 22.5.2009, 08:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(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)


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

Это сообщение отредактировал(а) DimW - 22.5.2009, 09:18
PM MAIL ICQ   Вверх
GUZstav
Дата 24.5.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 25.4.2009

Репутация: нет
Всего: нет



Спасибо, выручил. Еще вопрос: если для 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 ?)
PM MAIL   Вверх
DimW
Дата 25.5.2009, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(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)

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.