MySQL получает соответствующие строки для столбцов min и max как в одной строке - PullRequest
0 голосов
/ 26 сентября 2019

Hellow экспертов!У меня есть таблица расписаний, как показано ниже:

таблица расписаний

+-------------------------------------------+
|employee_no    |time             |device_id|
+-------------------------------------------+
|1              |2019-09-17 07:00 |001      |
|1              |2019-09-17 14:00 |002      |
|2              |2019-09-19 08:00 |002      |
|2              |2019-09-20 15:00 |003      |
+-------------------------------------------+

Я использую следующий запрос для получения входных и выходных данных о сотрудниках

select  timesheets.employee_no, 
        MIN(time) as in_time, 
        MAX(time) as out_time, 
        COUNT(`time`) as record_count
from timesheets 
where `time` between '2019-09-17 00:00:00' 
                      and '2019-09-17 23:59:59' 
group by timesheets.employee_no

и я получаю желаемый результат, как и ожидалось, как показано ниже

+----------------------------------------------------------------+
|employee_no    |in_time          |out_time         |record_count|
+----------------------------------------------------------------+
|1              |2019-09-17 07:00 |2019-09-17 14:00 |2           |
|2              |2019-09-19 08:00 |2019-09-20 15:00 |2           |
+---------------------------------------------------+------------+

Теперь мне нужно получить device_id для входных и выходных записей как time_in_device_id и time_out_device_id.Как этого добиться?

Ответы [ 2 ]

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

Не используйте between со временем.Следующее проще и точнее.

MySQL не предлагает функции агрегации «first ()» и «last ()».Тем не менее, вы можете использовать манипуляции со строками, чтобы делать то, что вы хотите:

select ts.employee_no, 
       MIN(time) as in_time, 
       MAX(time) as out_time, 
       COUNT(time) as record_count,
       SUBSTRING_INDEX(GROUP_CONCAT(device_id ORDER BY time), ',', 1) as first_device_id,
       SUBSTRING_INDEX(GROUP_CONCAT(device_id ORDER BY time DESC), ',', 1) as lasst_device_id
from timesheets ts
where `time` >= '2019-09-17' and
      `time` < '2019-09-18' 
group by ts.employee_no
0 голосов
/ 26 сентября 2019

использовать подзапрос

select a.*,b.deviceid as indeviceid,b1.deviceid as outdeviceid from
    (
    select  timesheets.employee_no, MIN(time) as in_time, MAX(time) as out_time, COUNT(`time`) as record_count
     from timesheets 
     where `time` between '2019-09-17 00:00:00' and '2019-09-17 23:59:59' group by timesheets.employee_no
    ) a join timesheets b on a.in_time=b.time
      join timesheets b1 a.out_time=b1.time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...