【发布时间】:2015-02-19 17:01:06
【问题描述】:
我正在尝试编写执行以下操作的查询:
- 从访问表中获取 Start_Date 和 End_Date
- 对于包含在日期范围内的每个日期,搜索遭遇表 查看某位提供者在该日期是否看过患者
- 生成一个表格,显示每个日期以及谁在该日期看到了患者 日期。
- 注意事项:
- 患者可能在那个日期没有见过,这将导致 NULL 或类似的结果
- 可能不止一位提供者在某个日期看过患者,这会导致该日期出现多条线路。
简化示例:
开始日期:15 年 1 月 1 日
结束日期:15 年 1 月 4 日
期望的输出:
╔══════╦══════════╦═══════╦═══════╗
║ ID ║ DATE ║ NAME ║ TYPE ║
╠══════╬══════════╬═══════╬═══════╣
║ 2222 ║ 1-Jan-15 ║ Smith ║ Note ║
║ 2222 ║ 2-Jan-15 ║ Jones ║ Note ║
║ 2222 ║ 2-Jan-15 ║ Smith ║ Order ║
║ 2222 ║ 3-Jan-15 ║ NULL ║ ║
║ 2222 ║ 4-Jan-15 ║ Jones ║ Note ║
╚══════╩══════════╩═══════╩═══════╝
这是我到目前为止所得到的。这会生成这些特定提供者何时看到患者的列表,但对于那些没有看到患者的日期,它不会导致 NULL。
SELECT V.VISIT_ID, ET.ENCOUNTER_TRANSACTION_DATE, P.NAME_LAST, ETT.ENC_TRANS_TYPE_NAME
FROM VISIT V
RIGHT OUTER JOIN ENCOUNTER_TRANSACTION ET ON V.VISIT_ID = ET.VISIT_ID AND V.INSTITUTION_ID = ET.INSTITUTION_ID
INNER JOIN ENCOUNTER_TRANSACTION_TYPE ETT ON ET.ENCOUNTER_TYPE_ID = ETT.ENCOUNTER_TRANSACTION_TYPE_ID
INNER JOIN LOCAL_PROVIDER LP ON ET.ORDERING_PROVIDER_ID = LP.LOCAL_PROVIDER_ID
INNER JOIN PERSON_IDENTIFIER I ON I.IDENTIFIER = LP.PROVIDER_NUMBER AND I.IDENTIFIER_SYS_ID = LP.PROVIDER_NUMBER_SYS_ID
INNER JOIN PERSON P ON P.PERSON_ID = I.PERSON_ID
WHERE
V.INSTITUTION_ID = 1 AND
V.END_DATE IS NOT NULL AND
V.VOIDED_YN = 'N' AND
V.CARE_SETTING_CODE = 'I' AND
V.PATIENT_TEAM_ID IN (16, 17, 18) AND
V.START_DATE >= (TRUNC(ADD_MONTHS(CURRENT_DATE, -1),'mon')) AND
V.START_DATE <= (LAST_DAY(ADD_MONTHS(CURRENT_DATE, -1))) AND
I.IDENTIFIER IN (
'1234', --Smith
'4321', --Jones
)
ORDER BY V.VISIT_ID ASC, ET.ENCOUNTER_TRANSACTION_DATE ASC;
当前输出(缺少 03-JAN-15 的 NULL 行):
╔══════╦══════════╦═══════╦═══════╗
║ ID ║ DATE ║ NAME ║ TYPE ║
╠══════╬══════════╬═══════╬═══════╣
║ 2222 ║ 1-Jan-15 ║ Smith ║ Note ║
║ 2222 ║ 2-Jan-15 ║ Jones ║ Note ║
║ 2222 ║ 2-Jan-15 ║ Smith ║ Order ║
║ 2222 ║ 4-Jan-15 ║ Jones ║ Note ║
╚══════╩══════════╩═══════╩═══════╝
【问题讨论】:
-
您提供了预期的输出,但忽略了提供输入数据,这使得我们很难测试我们的解决方案是否按预期工作。特别是如果您拥有与看起来一样多的桌子!说了这么多,您可以创建一个列出日期的子查询(例如
select start_date + level from dual connect by level <= 10)并将您的主查询分区外连接到它,以便为每一天生成行。 -
RIGHT JOIN 是无用的,因为 WHERE 条件将它变成了 INNER JOIN。因此,请使用 David Faber 的解决方案并将其加入到您现有的联接中