Pivot DateTime поля по дате - PullRequest
       7

Pivot DateTime поля по дате

0 голосов
/ 30 апреля 2018

У меня есть таблица, содержащая «удары» (входы / выходы) сотрудника, каждый удар может быть «in» (punch_type = 1) или «out» (punch_type = 2).

Таблица отформатирована следующим образом:

    emp_num | report_date | punch_time             | punch_type
    -----------------------------------------------------------
    1       | 2018-04-20  |2018-04-20 04:46:00.000 | 1
    1       | 2018-04-20  |2018-04-20 06:58:00.000 | 2
    1       | 2018-04-20  |2018-04-20 08:10:00.000 | 1
    1       | 2018-04-20  |2018-04-20 12:00:00.000 | 2 

Я пытаюсь получить первый «удар» (часы) и следующий «удар» (часы) в одном ряду. Тогда, конечно, любое следующее будет таким же.

Желаемый вывод:

    emp_num | report_date | punch_in               | punch_out
    -----------------------------------------------------------
    1       | 2018-04-20  |2018-04-20 04:46:00.000 | 2018-04-20 06:58:00.000
    1       | 2018-04-20  |2018-04-20 08:10:00.000 | 2018-04-20 12:00:00.000

Имейте в виду, что в один день может быть несколько комбо-ударов в / из, как показано в примере.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 01 мая 2018
select emp_num, report_date, max(case when punch_type=1 then punch_time else null end) punch_in, 
max(case when punch_type=2 then punch_time else null end) punch_out 
from (select *, row_number() over(partition by emp_num, report_date, punch_type order by emp_num, report_date, punch_time) value from yourtable )a
group by emp_num, report_date, value
0 голосов
/ 01 мая 2018

Сначала вы хотите узнать, какому времени удара соответствует какой удар по времени. Ответ: время n-го удара относится к времени n-го удара. Ну и нумерация ваших записей:

select
  p_in.emp_num,
  p_in.report_date,
  p_in.punch_time as punch_in,
  p_out.punch_time as punch_out
from
(
  select
    emp_num,
    report_date,
    punch_time,
    row_number() over (partition by emp_num, report_date order by punch_time) as rn
  from mytable
  where punch_type = 1
) p_in
left join
(
  select
    emp_num,
    report_date,
    punch_time,
    row_number() over (partition by emp_num, report_date order by punch_time) as rn
  from mytable
  where punch_type = 2
) p_out on p_out.emp_num = p_in.emp_num
        and p_out.report_date = p_in.report_date
        and p_out.rn = p_in.rn
order by p_in.emp_num, p_in.report_date, punch_in;
...