Запрос Oracle для получения сотрудника времени на вход и выход для сгенерированного запроса на основе первых и последних - PullRequest
0 голосов
/ 19 сентября 2019

Я хотел, чтобы посещаемость работника основывалась на / в нашем столбце таблицы базы данных Oracle.Имя столбца - Направление, которое имеет значение входа / выхода, а время - в другом столбце.Моя проблема заключается в том, что я получаю больше и больше времени на вход для сотрудников, так как они делают вход и выход больше, чем один раз с их системой оплаты карточек.Я хотел получить только первый раз для каждого сотрудника и последний раз для каждого сотрудника.Вот мой запрос для этого

select
fullname,direction,to_char(((TO_DATE('19700101','yyyymmdd') + (tstamp/24/60/60) + 6/24)), 'dd-mm-yyyy  hh12:mi:ss PM') as Time,
gate,lane,employment.employeeid,NATIONALID,departmentname,designation.designationname
from eofficeuat.entrylog_cpa
join eofficeuat.employee on entrylog_cpa.hrrecordid=employee.hrrecordid
join eofficeuat.employment on employee.hrrecordid=employment.hrrecordid
join eofficeuat.designation on employment.designationid=designation.designationid
join eofficeuat.department on employment.departmentid=department.departmentid
where department.departmentname = 'SECURITY'
and tstamp >= 1568763700 and tstamp < (select (sysdate - date '1970-01-01') * 86400000 from dual)
order by fullname desc;

вот данные для запроса

fullname        Direction   Time
--------        ---------   ----------

Utpal Dhar      In          18-09-2019  08:02:00 AM
Utpal Dhar      In          18-09-2019  08:04:31 AM
Utpal Dhar      In          18-09-2019  08:04:35 AM
TOPAZZAL HOSEN  In          19-09-2019  07:57:51 AM
TOPAZZAL HOSEN  In          18-09-2019  07:56:39 AM
TOPAZZAL HOSEN  out         18-09-2019  04:13:18 PM
TOPAZZAL HOSEN  out         18-09-2019  12:36:23 PM

этот запрос дает время входа и выхода для каждого сотрудника, но мне нужна только строка, которая будет первойво времени с в направлении и последний раз с последним направлением.

Вот строки, которые я ожидаю

fullname        Direction   Time
--------        ---------   ----------

Utpal Dhar      In          18-09-2019  08:02:00 AM
TOPAZZAL HOSEN  In          18-09-2019  07:56:39 AM
TOPAZZAL HOSEN  out         18-09-2019  04:13:18 PM

Пожалуйста, помогите мне с этим

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы можете использовать analytical function - ROW_NUMBER() в такой ситуации:

SELECT
    FULLNAME,
    DIRECTION,
    TIME
FROM
    (
        SELECT
            T.*,
            ROW_NUMBER() OVER(
                PARTITION BY FULLNAME, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy  hh12:mi:ss PM'))
                ORDER BY
                    CASE
                        WHEN T.DIRECTION = 'In' THEN TO_DATE(TIME, 'dd-mm-yyyy  hh12:mi:ss PM')
                    END
            ) AS IN_TIME_RN,
            ROW_NUMBER() OVER(
                PARTITION BY FULLNAME, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy  hh12:mi:ss PM'))
                ORDER BY
                    CASE
                        WHEN T.DIRECTION = 'Out' THEN TO_DATE(TIME, 'dd-mm-yyyy  hh12:mi:ss PM')
                    END DESC
            ) AS OUT_TIME_RN
        FROM
            ( YOUR_QUERY ) T
    )
WHERE
    CASE
        WHEN DIRECTION = 'In' THEN IN_TIME_RN
        ELSE OUT_TIME_RN
    END = 1;

Cheers !!

0 голосов
/ 19 сентября 2019

Упорядочить по времени, затем выбрать верхний ряд, используя rownum. Здесь - способ, которым вы можете использовать.

SELECT A.FULLNAME, B.DIRECTION, B.TIME 
FROM eofficeuat.employee A
JOIN (
//YOUR QUERY GOES HERE
select
fullname,direction,to_char(((TO_DATE('19700101','yyyymmdd') + (tstamp/24/60/60) + 6/24)), 'dd-mm-yyyy  hh12:mi:ss PM') as Time,
gate,lane,employment.employeeid,NATIONALID,departmentname,designation.designationname
from eofficeuat.entrylog_cpa
join eofficeuat.employee on entrylog_cpa.hrrecordid=employee.hrrecordid
join eofficeuat.employment on employee.hrrecordid=employment.hrrecordid
join eofficeuat.designation on employment.designationid=designation.designationid
join eofficeuat.department on employment.departmentid=department.departmentid
where department.departmentname = 'SECURITY'
and tstamp >= 1568763700 and tstamp < (select (sysdate - date '1970-01-01') * 86400000 from dual)
WHERE ROWNUM = 1 // the rownum should be here
order by fullname desc;
//YOUR QUERY GOES HERE
) B
ON A.FULLNAME = B.FULLNAME
GROUP BY A.FULLNAME, B.DIRECTION, B.TIME 

Это должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...