Как сгруппировать по дате и получить время входа и выхода? - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу получить все входящие / исходящие события в строке. Моя таблица выглядит так;

Trnevents:

 emp_id EVENTID     DT
 4176   3   2019-04-09 15:34:12.000
 4176   1   2019-04-09 08:55:13.000
 4176   3   2019-04-08 16:08:32.000
 4176   2   2019-04-08 15:08:18.000
 4176   1   2019-04-08 14:41:37.000
 4176   0   2019-04-08 08:45:13.000

Я пробовал запрос ниже, но не удовлетворен этим выводом

 select
t.emp_reader_id as empId,B.emp_name, cast(max(DT) as date) as Belongs_to,B.areaname as POINTID,
 max(iif(EVENTID = 0, DT, null)) as F1, max(iif(EVENTID = 1, DT, null)) as F2, max(iif(EVENTID = 2, DT, null)) as F3, max(iif(EVENTID = 3, DT, null)) as F4,
  format(dateadd(ss,Datediff(second,max(iif(EVENTID = 0, DT, null)),max(iif(EVENTID = 3, DT, null))),0),'HH:mm') as Worked from (   
select
    *, grp = sum(iif(EVENTID = 0, 3, 0) ) over (partition by emp_reader_id order by DT)
from        Trnevents ) t inner join employee B on t.emp_reader_id=B.emp_reader_id where b.emp_reader_id=4176
   group by t.emp_reader_id,t.grp,B.emp_name,t.Belongs_to,B.areaname
                  order by emp_reader_id,t.Belongs_to,F1,F2 asc

Ожидается, что будет:

  emp_id       dt          f1        f2       f3      f4     hours
  4176     2019-04-08     08:45     14:41   15:08    16:08   06:41
  4176     2019-04-08     08:55       -        -       15:34   06:39

Мне нужен именно вывод, как упомянуто выше. Заранее спасибо

EVENTID:

0 как F1, 1 как F2, 2 как F3, 3 как F4

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Следующее находится в базе данных оракула. Так что не запутайтесь в «двойственности», и ведите с помощью простого моделирования входных данных. Также на оракуле trunc (date_time) возвращает только часть даты. Первое, с помощью которого создаются mydata - это симулировать ввод. Затем следующий с получает f1f4, принимая абсолютные мин / макс по дате. Затем вычисляет f2 и f4, говоря, что нам нужны только те строки, где даты не совпадают с f1 и f4. По вашему правилу либо emp + dat имеет 2 или 4 строки. Затем final соединяет исходный код с этими 2, чтобы получить f1, f2, f3, f4. Отличительной особенностью является то, что драйвер является оригинальным

with mydata as (
    select '4176' emp_id, '3' eventid, to_date('2019-04-09 15:34:12', 'YYYY-MM-DD HH24:MI:SS') dt from dual union all
    select '4176' emp_id, '1' eventid, to_date('2019-04-09 08:55:13', 'YYYY-MM-DD HH24:MI:SS') dt from dual union all
    select '4176' emp_id, '3' eventid, to_date('2019-04-08 14:41:37', 'YYYY-MM-DD HH24:MI:SS') dt from dual union all
    select '4176' emp_id, '2' eventid, to_date('2019-04-08 15:08:18', 'YYYY-MM-DD HH24:MI:SS') dt from dual union all
    select '4176' emp_id, '1' eventid, to_date('2019-04-08 14:41:37', 'YYYY-MM-DD HH24:MI:SS') dt from dual union all
    select '4176' emp_id, '0' eventid, to_date('2019-04-08 08:45:13', 'YYYY-MM-DD HH24:MI:SS') dt from dual
),
getf1f4 as (
    select emp_id, trunc(dt) dt, count(*) num_rows, min(dt) f1, max(dt) f4
    from mydata
    group by emp_id, trunc(dt)
),
getf2f3 as (
    select ee.emp_id, getf1f4.dt,
           min(ee.dt) f2,
           max(ee.dt) f3
    from mydata ee join getf1f4 on ee.emp_id = getf1f4.emp_id and trunc(ee.dt) = getf1f4.dt
    where ee.dt not in ( getf1f4.f1, getf1f4.f4)
    group by ee.emp_id, getf1f4.dt
)
select distinct 
       ee.emp_id, getf1f4.dt, getf1f4.f1, getf2f3.f2, getf2f3.f3, getf1f4.f4
from mydata ee 
     join getf1f4 on ee.emp_id = getf1f4.emp_id and trunc(ee.dt) = getf1f4.dt
     left outer join getf2f3 on ee.emp_id = getf2f3.emp_id and trunc(ee.dt) = getf2f3.dt
1 голос
/ 10 апреля 2019

@ dolu bolu

запрашиваемый sql-запрос может быть отослан и изменен из нижеследующего запроса:

select emp_id, day, f1, f2, f3, f4  from 
(select a.emp_id,to_char(a.DT,'DD-MON-YYYY') day,
(select to_char(b.DT,'HH24:MI') from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY') and b.event_id=0 ) F1,
(select to_char(b.DT,'HH24:MI') from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY') and b.event_id=1 ) F2,
(select to_char(b.DT,'HH24:MI') from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY') and b.event_id=2 ) F3,
(select to_char(b.DT,'HH24:MI') from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY') and b.event_id=3 ) F4,
(select max(b.DT) from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY')  ) max_time,
(select min(b.DT) from sample_event b where b.emp_id=a.emp_id and to_char(b.DT,'DD-MON-YYYY')=to_char(a.DT,'DD-MON-YYYY')  ) min_time
from sample_event a group by a.emp_id,to_char(a.DT,'DD-MON-YYYY'))
order by day;

вы можете использовать функцию datediff для получения часов между max_time и min_time

1 голос
/ 09 апреля 2019

ниже приведен фрагмент кода:

SELECT emp_id,day,
TO_CHaR(to_date(F1,'HH24:MI'),'HH24:MI') F1,
TO_CHaR(to_date(F2,'HH24:MI'),'HH24:MI') F2,
TO_CHaR(to_date(F3,'HH24:MI'),'HH24:MI') F3,
TO_CHaR(to_date(F4,'HH24:MI'),'HH24:MI') F4  FROM (
  SELECT emp_id,event_id,to_char(DT,'DD-MON-YYYY') day ,to_number(replace(to_char(DT,'HH24:MI'),':','.'),'99.99') dt_time from sample_event a

)
PIVOT (
  avg(dt_time)
  FOR event_id in (
    0 F1,1 F2,2 F3,3 F4  )
)

ORDER BY DAY asc;

-- output
EMP_ID  DAY         F1      F2      F3      F4
4176    08-APR-2019 08:45   14:41   15:08   16:08
4176    09-APR-2019  -      08:55    -      15:34

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