如何从SQL Server中ID和日期的另一个列表中查询与ID和日期匹配的数据?

时间:2019-03-21 20:29:41

标签: sql sql-server

我有一张表格,其中包含有关患者的数据。该表除其他外具有Patient IDAdmissionDate。同一患者可能有多个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-22F002有2个:2017-04-02, 2018-07-13

现在,我在下一个栏中有ID的电子表格,其中包含其录入日期。我分别提取了ID和日期,并将其添加到以下查询中

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 个答案:

答案 0 :(得分:1)

我认为您应该像这样构造查询:

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;