Справка по SQL-запросу - PullRequest
       2

Справка по SQL-запросу

4 голосов
/ 19 июля 2010

В предыдущем посте я делал очень простую базу данных с 3 таблицами «доктор», «пациент» и «визит».Я попытался сделать это более реалистичным и теперь включил в себя отношения «многие ко многим» между «доктором» и «пациентом».«визит» - это таблица, приводящая к этому отношению нм.Я предполагаю следующую простую структуру для моей таблицы:

doctor
- idDoctor
- name

patient
-idPatient
-name
-dob

visit
-idVisit
-idPatient
-idDoctor
-timestamp

Я использую следующие данные, по которым я хочу сделать запрос:

idVisit  idDoctor  idPatient  timestamp
1        1         1          2010-07-19 14:10
2        1         2          2010-07-19 15:10
3        2         1          2010-07-19 15:10
4        3         1          2010-07-19 16:10
5        2         2          2010-07-19 18:10
6        2         3          2010-07-19 19:10
7        1         1          2010-07-19 20:10

У меня есть 3 пациента и3 доктора.Например, пациент 1 дважды ходил к врачу 1, врачу 2 раза и врачу 3 раза.

Я хотел бы составить свой запрос так, чтобы на каждую пару (врач, пациент) у меня былПоследний визит.Этот запрос должен возвращать идентификаторы посещений (2,3,4,5,6, 7), а не 1, поскольку последний визит, который пациент нанес врачу 1, был в 20:10, а не в 14:10.Как я могу это сделать?

Я очень ценю ваши комментарии и вашу помощь.Это действительно помогает мне улучшить свои проекты, когда я начинаю использовать SQL.

Ответы [ 3 ]

4 голосов
/ 19 июля 2010

При условии, что идентификаторы расположены в хронологической последовательности, вы можете "обмануть"

SELECT MAX(idVisit) AS idVisit,  idDoctor,  idPatient 
FROM visit
group by idDoctor,  idPatient 

Если это предположение не может быть сделано

SELECT v.idVisit,  v.idDoctor,  v.idPatient 
FROM visit v
WHERE NOT EXISTS
(
    SELECT * FROM visit v2
    WHERE v2.idDoctor = v.idDoctor
    AND v.idPatient = v2.idPatient
    AND v2.timestamp > V.timestamp
)

Или, если ваша СУБД поддерживает это,

WITH V AS
(
SELECT idVisit, idDoctor, idPatient,
row_number() over(partition by idDoctor,  idPatient order by timestamp desc) AS RN
FROM visit
)

SELECT idVisit, idDoctor, idPatient
FROM V 
WHERE RN=1
1 голос
/ 19 июля 2010
select v.idVisit, d.idDoctor, d.name as nameDoctor, p.idPatient, p.name as namePatient, v.timestamp as lastVisit
from visit v 
join doctor d on v.idDoctor = d.idDoctor
join patient p on v.idPatient = p.idPatient
where not exists
    (select 1 from visit where idDoctor = v.idDoctor and idPatient = v.idPatient and timestamp > v.timestamp)
0 голосов
/ 19 июля 2010

Ответ аналитики Oracle:

SELECT idVisit, idDoctor, idPatient, 
       max(timestampVisit) 
         over (partition by idDoctor, idPatient) as timestampVisit
  FROM visits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...