@
ESeanZ @
a87965028 谢谢大家!我写完了。
思路是
1. 先分别选出 IN 和 OUT 的数据
2. 再 LEFT JOIN ON (出的时间晚于进的时间)
3. 最后根据人员和进入时间分组,出的时间排序,每一个进入时间选择最早出的时间( RN = 1 )
SELECT T3.F_ID
, T3.F_NAME
, T3.IN_T
, T3.OUT_T
, T3.RN
FROM (
SELECT T1.F_ID
, T1.F_NAME
, T1.DATE_TIME IN_T
, T2.DATE_TIME OUT_T
, ROW_NUMBER() OVER(PARTITION BY T1.F_ID, T1.DATE_TIME
ORDER BY T2.DATE_TIME) RN
FROM
(SELECT F1.DATE_TIME
, F1.F_ID
, F1.F_NAME
, F1.F_DEPART
, F1.IN_OUT
FROM ADMIN.FAB_TIME F1
WHERE F1.IN_OUT = '001-正常进入开门'
AND F1.DATE_TIME BETWEEN
TO_DATE(20191001000000, 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE(20191002000000, 'YYYY-MM-DD HH24:MI:SS')
) T1
LEFT JOIN
(SELECT F1.DATE_TIME
, F1.F_ID
, F1.F_NAME
, F1.F_DEPART
, F1.IN_OUT
FROM ADMIN.FAB_TIME F1
WHERE F1.IN_OUT = '002-正常外出开门'
AND F1.DATE_TIME BETWEEN
TO_DATE(20191001000000, 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE(20191002000000, 'YYYY-MM-DD HH24:MI:SS')
) T2
ON T1.F_ID = T2.F_ID
AND T1.DATE_TIME <= T2.DATE_TIME
ORDER BY T1.F_ID,T1.DATE_TIME
) T3
WHERE T3.RN = 1
;