Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2023, 16:27   #1
reaque
 
Регистрация: 06.04.2009
Сообщений: 4
По умолчанию min max

Есть таблица
emp, date, event
100, 2023-03-16 08:10:00, Вход
100, 2023-03-16 08:12:00, Вход
100, 2023-03-16 08:15:00, Вход
100, 2023-03-16 16:15:00, Выход
100, 2023-03-16 16:25:00, Выход
200, 2023-03-16 08:05:00, Вход
200, 2023-03-16 16:55:00, Выход

Emp - сотрудник
Date - дата события входа или выхода
Event - событие

Как написать запрос одним select-ом,
чтобы по каждому сотруднику вывести в одну строку информацию о минимальной дате/времени входа и максимальной дате/времени выхода в разрезе каждого дня

должно получится так:
emp, дата, время начала, время окончания
100, 2023-03-16, 08:10:00, 16:25:00
200, 2023-03-16, 08:05:00, 16:55:00
reaque вне форума Ответить с цитированием
Старый 17.03.2023, 09:21   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1. начать с этого
Код:
select emp, event, day(date), max(date), min(date)
from ....
group by emp, event, day(date)
day(date) --функция получения исключительно датЫ из имеющегося даты-времени(date) зависит от используемой СУБД и может иметь совсем другой формат

2. и потом продолжить
Код:
select emp.*, indate.*, outdate.*
from ( -- сотрудники 
          select distinct emp from t
        ) emp
left join ( --входы ПО дням и сотр.
              select ...
              where event='вход'
              group by ...
           ) indate
left join ( --выходы аналогично
              select ....
              where event='выход'
              group by ...
            ) outdate
до получения нужного результата

P.S.
Код:
case when event='вход' then min(time(date)) when event='выход' then max(time(date)) else null end
time(date) -- аналогично day(date) но исключительно время
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.03.2023 в 09:33.
evg_m на форуме Ответить с цитированием
Старый 17.03.2023, 12:22   #3
reaque
 
Регистрация: 06.04.2009
Сообщений: 4
По умолчанию

да, так у меня получилось изначально, но хотелось бы вывести информацию одним запросом к базовой таблице, например используя расширение типа pivot или другой функции
reaque вне форума Ответить с цитированием
Старый 17.03.2023, 13:24   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

исправленный п.2. (забыл ON... )
для вывода вход.выход в ОДНУ строчку
Код:
elect emp.*, indate.*, outdate.*
from ( -- сотрудники и дни
          select distinct emp, day(date) as dd from t
        ) emp
left join ( --входы ПО дням и сотр.
              select ...day(date) as dd
              where event='вход'
              group by ...
           ) indate on emp.emp =indate.emp and emp.dd =indate.dd
left join ( --выходы аналогично
              select .....day(date) as dd
              where event='выход'
              group by ...
            ) outdate on emp.emp =outdate.emp and emp.dd =outdate.dd
если получиться можно доработать п.1 используя P.S. из моего предыдущщего поста
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.03.2023 в 13:32.
evg_m на форуме Ответить с цитированием
Старый 20.03.2023, 09:37   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
если получиться можно доработать п.1 используя P.S. из моего предыдущщего поста
1. получить ДВА отдельных поля (вход, выход)
Код:
select emp, day(date) as dd, 
case when event ='вход' then time(date) else null end as intime,
case when event ='выход' then time(date) else null end as outtime
from ...
2. а теперь сгруппировать полученное.
Код:
select emp, dd, min(intime), max(outtime)
from ( --смотри п.1.
          select .....
        ) as inout
group by emp, dd
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск