我试图找到在另一个日期/时间值的24小时内发生的第一个日期/时间值。SQL:另一日期/时间的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
)
问题:
- 没有异体w缺少评论(规则#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
条款似乎并不是最佳的,这个方法工作。有没有更高效的查询?
你说你想要的最低,这表明我应该在你的查询某处查看min()函数。 –
@DanBracuk,子选择中有一个“MIN”。'SELECT MIN(REVIEWED_TIME)...' – craig