我正在尝试查找在另一个日期/时间值的 24 小时内出现的第一个日期/时间值。
ENCOUNTER 表:
ENC_ID ADMSN_TIME DISCH_TIME
16755387 03/19/13 11:10:00 03/22/13 12:55:00
PROBLEM_LIST 表:
ENC_ID REVIEWED_TIME USER_ID
16755387 03/19/13 13:02:00 FOOBAR
16755387 03/19/13 13:03:00 FOOBAR
16755387 03/20/13 07:52:00 FOOBAR
16755387 03/22/13 08:35:00 FOOBAR
16755387 03/22/13 08:35:00 FOOBAR
16755387 03/22/13 08:35:00 FOOBAR
期望的结果集:
ENC_ID ADMSN_TIME ADMSN_REVIEW_TIME ADMSN_REVIEWER DISCH_REVIEW_TIME DISCH_REVIEWER
16755387 03/19/13 11:10:00 03/19/13 13:02:00 FOOBAR 03/22/13 08:35:00 FOOBAR
规则:
- ABS(REVIEWED_TIME - ADMSN_TIME)<=1
- ABS(REVIEWED_TIME - DISCH_TIME)<=1
- 可能没有与入院、出院或两者都对应的复习时间
我的第一次尝试:
SELECT E.ENC_ID,
E.ADMSN_TIME,
R0.REVIEWED_TIME ADMSN_REVIEWED_TIME,
R0.USER_ID ADMSN_REVIEWER,
E.DISCH_TIME,
R1.REVIEWED_TIME DISCH_REVIEWED_TIME,
R1.USER_ID DISCH_REVIEWER
FROM ENCOUNTER E
INNER JOIN PROBLEM_LIST R0 ON HE.ENC_ID=R0.ENC_ID
and r0.REVIEWED_TIME = (
SELECT MIN(REVIEWED_TIME)
FROM PROBLEM_LIST
WHERE ENC_ID=E.ENC_ID
AND ABS(REVIEWED_TIME - ADMSN_TIME)<=1
)
INNER JOIN PROBLEM_LIST R1 ON E.ENC_ID=R1.ENC_ID
and r1.REVIEWED_TIME = (
SELECT MIN(REVIEWED_TIME)
FROM PROBLEM_LIST
WHERE ENC_ID=E.ENC_ID
AND ABS(REVIEWED_TIME - DISCH_TIME)<=1
)
问题:
- 不允许漏检(规则#3);使用 'OUTER JOIN' 会产生语法错误
- 不会消除重复的 PROBLEM_LIST 记录
有没有办法使这项工作?
** 编辑 **
SELECT DISTINCT ENC_ID,
E.ADMSN_TIME,
FIRST_VALUE(R0.REVIEWED_TIME) OVER (PARTITION BY R0.ENC_ID ORDER BY R0.REVIEWED_TIME) ADMSN_REVIEWED_TIME,
FIRST_VALUE(R0.USER_ID) OVER (PARTITION BY R0.ENC_ID ORDER BY R0.REVIEWED_TIME) ADMSN_REVIEWED_BY,
E.DISCH_TIME,
FIRST_VALUE(R1.REVIEWED_TIME) OVER (PARTITION BY R1.ENC_ID ORDER BY R1.REVIEWED_TIME) DISCH_REVIEWED_TIME
,FIRST_VALUE(R1.USER_ID) OVER (PARTITION BY R1.ENC_ID ORDER BY R1.REVIEWED_TIME) DISCH_REVIEWED_BY
FROM ENCOUNTER E
LEFT JOIN PROBLEM_LIST R0 ON E.ENC_ID=R0.ENC_ID
AND ABS(r0.REVIEWED_TIME - ADMSN_TIME)<=1
LEFT OUTER JOIN PROBLEM_LIST R1 ON E.ENC_ID=R1.ENC_ID
AND ABS(R1.REVIEWED_TIME - DISCH_TIME)<=1
这种方法可以按预期工作,但该DISTINCT
子句似乎不是最优的。有没有更高效的查询?