Как запросить данные, соответствующие идентификатору и дате из другого списка идентификаторов и дат в SQL Server? - PullRequest
1 голос
/ 21 марта 2019

У меня есть таблица, которая содержит данные о пациенте. Таблица имеет Patient ID, AdmissionDate, между прочим. У одного и того же пациента может быть несколько AdmissionDate. Меня интересуют только избранные пациенты, у которых дата поступления падает в выбранную дату. Например: таблица ниже

patient_id | admission_date
-----------+---------------
F001         2018-07-13
F002         2017-04-02
F003         2018-07-13
F004         2018-04-05
F005         2015-06-13
F001         2017-04-02
F002         2018-07-13
F001         2018-04-22

В приведенной выше таблице F001 имеет 3 приема: 2018-07-13, 2017-04-02, 2018-04-22 и F002 имеет 2: 2017-04-02, 2018-07-13.

Теперь у меня есть электронная таблица идентификаторов с датами их поступления в следующем столбце. Я взял идентификаторы и даты отдельно и добавил их в следующий запрос

WITH TableA AS
(
    SELECT 
        CONVERT(date, admission_date) as admit_date, *
    FROM 
        AdmissionTable
    WHERE 
        patient_id IN ('F001', 'F002', 'F003', 'F004', 'F005') 
)
SELECT *
FROM TableA
WHERE admit_date IN ('2018-07-13', '2017-04-02', '2018-07-13','2018-04-05,'2015-06-13','2017-04-02','2018-07-13','2018-04-22')

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

Как я могу это исправить? Какой лучший способ справиться с этим?

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

patient_id | admission_date
-----------+---------------
F001         2018-04-22
F002         2018-07-13
F003         2018-07-13
F004         2018-04-05
F005         2015-06-13

1 Ответ

1 голос
/ 21 марта 2019

Я думаю, вы должны построить запрос следующим образом:

with from_spreadsheet as (
      select v.*
      from (values ('F001', '2018-07-13'), ('F002', '2017-04-02'), . . .
           ) v(patient_id, admission_date)
     )
select a.*
from admissiontable a join
     from_spreadsheet fs
     on fs.patient_id = a.patient_id and
        convert(date, fs.admission_date) = a.admission_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...