Используйте функцию ROW_NUMBER
analyti c:
create table tblaccesslogs (
EVENTID,
USERID,
DATE_TIME,
READERID,
READERNAME,
SNAME,
LOGTYPE,
USERNAME
) AS
SELECT 177792329, 50078, DATE '2020-01-02' + INTERVAL '05:45:34' HOUR TO SECOND, 544381431, 'LOCKER', 'RF-T-33', 'IN', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177792497, 50078, DATE '2020-01-02' + INTERVAL '05:45:50' HOUR TO SECOND, 544343461, 'SENSORS', 'RF-T-19', 'IN', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177813432, 50078, DATE '2020-01-02' + INTERVAL '06:35:51' HOUR TO SECOND, 544352385, 'SENSORS', 'RF-T-20', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177813495, 50078, DATE '2020-01-02' + INTERVAL '06:36:13' HOUR TO SECOND, 544381436, 'LOCKER', 'RF-T-36', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177950118, 50078, DATE '2020-01-03' + INTERVAL '05:50:48' HOUR TO SECOND, 544352385, 'SENSORS', 'RF-T-20', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177954602, 50078, DATE '2020-01-03' + INTERVAL '05:54:11' HOUR TO SECOND, 544381436, 'LOCKER', 'RF-T-36', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177967366, 50078, DATE '2020-01-03' + INTERVAL '06:07:25' HOUR TO SECOND, 544381431, 'LOCKER', 'RF-T-33', 'IN', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177967448, 50078, DATE '2020-01-03' + INTERVAL '06:07:38' HOUR TO SECOND, 544343461, 'SENSORS', 'RF-T-19', 'IN', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177977184, 50078, DATE '2020-01-03' + INTERVAL '08:02:59' HOUR TO SECOND, 544352385, 'SENSORS', 'RF-T-20', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177977214, 50078, DATE '2020-01-03' + INTERVAL '08:03:21' HOUR TO SECOND, 544381436, 'LOCKER', 'RF-T-36', 'OUT', 'SUBIA, MAY' FROM DUAL UNION ALL
SELECT 177979653, 50078, DATE '2020-01-03' + INTERVAL '08:23:54' HOUR TO SECOND, 544381431, 'LOCKER', 'RF-T-33', 'IN', 'SUBIA, MAY' FROM DUAL;
Тогда:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY USERNAME, LOGTYPE, TRUNC( DATE_TIME )
ORDER BY DATE_TIME ASC
) AS first_date_time_rn
FROM tblaccesslogs t
WHERE READERNAME <> 'LOCKER'
)
WHERE logtype = 'IN'
AND first_date_time_rn = 1
выходы:
EVENTID | USERID | DATE_TIME | READERID | READERNAME | SNAME | LOGTYPE | USERNAME | FIRST_DATE_TIME_RN
--------: | -----: | :------------------ | --------: | :--------- | :------ | :------ | :--------- | -----------------:
177792497 | 50078 | 2020-01-02 05:45:50 | 544343461 | SENSORS | RF-T-19 | IN | SUBIA, MAY | 1
177967448 | 50078 | 2020-01-03 06:07:38 | 544343461 | SENSORS | RF-T-19 | IN | SUBIA, MAY | 1
и:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY USERNAME, LOGTYPE, TRUNC( DATE_TIME )
ORDER BY DATE_TIME DESC
) AS last_date_time_rn
FROM tblaccesslogs t
WHERE READERNAME <> 'LOCKER'
)
WHERE logtype = 'OUT'
AND last_date_time_rn = 1
выходы:
EVENTID | USERID | DATE_TIME | READERID | READERNAME | SNAME | LOGTYPE | USERNAME | LAST_DATE_TIME_RN
--------: | -----: | :------------------ | --------: | :--------- | :------ | :------ | :--------- | ----------------:
177813432 | 50078 | 2020-01-02 06:35:51 | 544352385 | SENSORS | RF-T-20 | OUT | SUBIA, MAY | 1
177977184 | 50078 | 2020-01-03 08:02:59 | 544352385 | SENSORS | RF-T-20 | OUT | SUBIA, MAY | 1
дБ <> скрипка здесь