SQL Сервер GROUP BY, но нужен один столбец сведений - PullRequest
0 голосов
/ 17 января 2020

У меня есть фабричная система сбора (времени) труда, которая отслеживает время рабочих и рабочие места, над которыми они работают. В этом конкретном случае я пытаюсь определить, кто забыл провести, основываясь на типе ВКЛ / ВЫКЛ последнего свайпа каждого работника в таблице данных. Рассмотрим трех рабочих, Джона, Мэтта и Шона. Их дни начинаются в 5:30 утра. Вот некоторые игровые данные:

create table johnmtest (empl_ID varchar(5), ONOFF varchar(2), TSTAMP DATETIME);
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('JOHNM', 'ON', '2020-01-15 05:31:06');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('SEANW', 'ON', '2020-01-15 05:33:17');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('MATTD', 'ON', '2020-01-15 05:35:31');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('SEANW', 'OF', '2020-01-15 13:07:41');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('JOHNM', 'OF', '2020-01-15 14:15:29');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('JOHNM', 'ON', '2020-01-15 14:21:11');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('MATTD', 'OF', '2020-01-15 15:01:27');
insert into jmtest (empl_ID, ONOFF, TSTAMP) values ('MATTD', 'ON', '2020-01-15 15:15:48'); 

Итак, мы видим, что Джон включил свой первый рабочий заказ в 5:31 утра, Мэтт начал в 5:35, а Шон начал в 5:33. Это все «ВКЛ», парни работают, часы работают.

  • В течение дня Джон заканчивает (ударил) свое первое рабочее поручение в 14:15 (OF), взял несколько минут перерыва и включил второе рабочее поручение в 14:21. Он активно работает.
  • То же самое с Мэттом. Мэтт работает над своим первым заказом с 5:35 до 15:01 (ON и OF). Он берет небольшой перерыв и начинает свой второй рабочий заказ в 15:15. Он также активно работает.
  • Но проблема в Шоне. В 5:33 Шон провел по своему первому заказу, а в 13:07 - по OF. Я смотрю на заводской цех и вижу Шона, работающего на буровом прессе, но его самым последним ударом по времени был провал (OF). Это означает, что он физически работает, но его не регистрируют для записи времени.

Поэтому я пытаюсь выполнить GROUP BY каждого сотрудника с его МАКСИМАЛЬНЫМ временем. Это просто с

select empl_ID, max(TSTAMP) from jmtest GROUP BY empl_ID

Но мне нужно каким-то образом вставить туда столбец ONOFF , чтобы я мог видеть, был ли последний раз проведением сотрудника ON или OF. Я пытаюсь добраться до этого:

empl_ID     ONOFF    TSTAMP
-------     -----    ------
SEANW        OF      2020-01-15 13:07:41
JOHNM        ON      2020-01-15 14:21:11
MATTD        ON      2020-01-15 15:15:48

На самом деле, мы намереваемся перенести эти данные на большие телевизионные дисплеи на заводском этаже, чтобы супервизоры могли видеть, кто не был включен. В этом случае, я надеюсь, что дополнительное предложение WHERE только из строк OF уменьшит список до следующего:

empl_ID     ONOFF    TSTAMP
-------     -----    ------
SEANW        OF      2020-01-15 13:07:41

Тогда Наблюдатели могут go найти Шона и кричать на него. Звучит просто, если посмотреть на пол и сравнить со списком данных, там 400 парней. Итак, было бы очень полезно только отображение записи OF.

Можно ли выполнить какую-либо группировку, которая затем включается в столбец ON / OF для полной картины? Или двухуровневый запрос? Спасибо, Джон

Ответы [ 2 ]

1 голос
/ 17 января 2020

Это распространенная проблема, и вот как она обычно реализуется в T SQL:

with q as
(
    select *, row_number() over (partition by empl_ID order by TSTAMP desc) rn
    from johnmtest
)
select empl_ID, ONOFF, TSTAMP
from q
where rn = 1

output

empl_ID ONOFF TSTAMP
------- ----- -----------------------
JOHNM   ON    2020-01-15 14:21:11.000
MATTD   ON    2020-01-15 15:15:48.000
SEANW   OF    2020-01-15 13:07:41.000

(3 rows affected)
0 голосов
/ 17 января 2020

Вы можете группировать и присоединиться. ie:

select t.* 
from jmTest t
inner join 
(select empl_Id, max(tStamp) as lastRec from jmTest group by empl_Id) mx
on t.empl_id = mx.empl_id and t.tStamp = mx.lastRec
where t.ONOFF = 'OF';

РЕДАКТИРОВАТЬ: DbFiddle Demo

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