Выберите максимальную и минимальную дату и время для отдельного пользователя

У меня есть запись, как показано ниже

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1    
   2         2017-04-01 12:30:00       1       2    
   3         2017-04-01 13:30:00       1       1    
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1    
   10        2017-04-03 12:30:00       3       2    
   11        2017-04-03 13:30:00       3       1    
   12        2017-04-03 18:30:00       3       2 

Я хочу получить первое время доступа и последнее ежедневное время выхода из системы (на каждый день) для каждого отдельного пользователя (значка).

Как я могу это сделать?

Запись, которую я хочу, как показано ниже

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1        
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1      
   12        2017-04-03 18:30:00       3       2 

Возможно ли это сделать? Спасибо.

ПРИМЕЧАНИЕ. ID автоматически увеличиваются, LETTORE 1 — это вход, а LETTORE 2 — выход.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
185
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать соединение с подзапросом для значка 1 и значка 2.

select t1.badge, min_dat, nax_date
from  (
  select  badge, min_(data_ora) min_data
  from my_table
  where lettore  = 1 
  group by badge 
) t1 
INNER JOIN  (
 select  badge, max_(data_ora) max_data
  from my_table
  where lettore  = 2
  group by badge 
) t2  ON t1.badge = t2.badge 

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

select * from tablename a
where DATA_ORA in (select min(DATA_ORA) from tablename b where a.badge=b.badge)
union 
select * from tablename a
where DATA_ORA in (select max(DATA_ORA) from tablename b where a.badge=b.badge)
Ответ принят как подходящий

Вы можете сделать это сгруппировав по дате, значку и леттеру, например:

SELECT date(DATA_ORA),badge,lettore, case when lettore=1 then min(time(data_ora))
                                          when lettore=2 then max(time(data_ora))
                                          else 0
                                     end
FROM table1
group by date(DATA_ORA),badge,lettore

Мне нравится ответ @fa06, но он упускает из виду, что вам нужны данные ежедневно. так что попробуйте это:

select * from t1 a
where DATA_ORA in (select min(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'))
union
select * from t1 a
where DATA_ORA in (select max(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'));

Вот выполненная версия вашей таблицы и запроса, которые выдают результат в том порядке, в котором вы нуждаетесь, в DB-рабочий пример. Попробуйте этот запрос:

select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,min(data_ora)from EntryExitLogs group by date(data_ora),badge))
    union
    (select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,max(data_ora)from EntryExitLogs group by date(data_ora),badge)))
    order by id;

Я думаю, что лучше использовать столбец идентификатора для выбора строк, потому что столбец временных меток содержит дубликаты.

Другие вопросы по теме