Imagine room with locked door. There are card reader near door. To open the door you need to put your card to cardreader.
I have 2 tables with events in my Oracle database -
entries ( door was opened from outside the room )
exits ( door was opened from inside the room )
All i want is to select presense intervals like
employee 1 was in room at some day from 10:00 to 11:00 and from 12:00 to 18:00.
But there are 3 problems
- Sometimes user opens the door but don't leave the room.
- Sometimes one user opens the door and another user goes out with him while
door is opened one time.
- Data size (about 100k in each table)
And questions:
- What is the best way to select presense intervals
- Is there any way to create fast refreshable materialized view to solve this?
Here is sample
drop table entries;
drop table exits;
CREATE TABLE ENTRIES
(
"EVENTDATE" DATE NOT NULL,
"EVENTTIME" DATE NOT NULL,
"EMPLOYEEID" NUMBER NOT NULL
);
CREATE TABLE EXITS
(
"EVENTDATE" DATE NOT NULL,
"EVENTTIME" DATE NOT NULL,
"EMPLOYEEID" NUMBER NOT NULL
);
delete from ENTRIES;
delete from exits;
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 08:44:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:18:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:19:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:22:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:37:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:38:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:39:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:40:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 13:22:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:40:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:36:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 11:55:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 18:02:00','DD-MON-RR HH24:MI:SS'));
Desired result is something like:
"EMPLOYEID" "EVENTDATE" "ENTERTIME" "LEAVETIME"
8 01-AUG-13 00:00:00 01-JAN-00 08:44:00 01-JAN-00 11:55:00
8 01-AUG-13 00:00:00 01-JAN-00 12:18:00 01-JAN-00 12:36:00
8 01-AUG-13 00:00:00 01-JAN-00 12:37:00 01-JAN-00 12:40:00
8 01-AUG-13 00:00:00 01-JAN-00 13:22:00 01-JAN-00 18:02:00
Update
If there are 2 enters in a row use first, ignore second.
If there are 2 exits in a row use second, ignore first