powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборки опоздавших
7 сообщений из 7, страница 1 из 1
Выборки опоздавших
    #39751503
Garred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такова, выбрать опоздавших за конкретный день, при условии, что человек может войти до времени опоздания, выйти и зайти уже во время опоздания (тогда опозданием не считается), войти и выйти человек может на любой из нескольких проходных, человек может зайти два раза во время опоздания (нужно исключить дубликаты).
Права к базе данных только на чтение, дата хранится в int, потому такие танцы с бубном (если есть решения получше - милости прошу, но напоминаю, что права только на чтение).
Вот что получилось у меня накидать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Select * 
from(SELECT distinct on (identity_id, cast((to_timestamp(event_date) at time zone 'UTC') as date)) 
						 identity_id as id, to_timestamp(event_date) at time zone 'UTC' as Дата, 
						 fio as ФИО, 
						 department as Отделение, 
						 rank as Должность,
						 event_source as Место
     FROM public.rpt_trx
     where (event_source = 'проходная вход №1' or
            event_source = 'проходная вход №2' or
            event_source = 'проходная вход №3') and
            event_type='Разрешение на вход' and
            (cast((to_timestamp(event_date) at time zone 'UTC') as time) between time '$time_start' and time '$time_end') and
            (cast((to_timestamp(event_date) at time zone 'UTC') as date) = date '$date')) as query
order by Дата desc;


Проблема двойных опозданий одного и того же человека решена с помощью distinct, но не могу понять, как решить проблему в один запрос, если человек отметился до времени опоздания, а потом вышел и вошёл во время опоздания.
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751504
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garred,

distinct - в сад !

Пронумеруй через
Код: sql
1.
row_number()over(partition by identity_id order by event_date)

выборку за день,
и выбери те записи, у которых RN=1

Вот среди этих записей, по условию between time '$time_start' and time '$time_end', и нужно искать "опоздавших"
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751505
Garred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, благодарю за ответ, у меня нету базы данных под рукой проверить, это примерно так должно выглядеть?

SELECT identity_id as id,
to_timestamp(event_date) at time zone 'UTC' as Дата,
fio as ФИО,
department as Отделение,
rank as Должность,
event_source as Место
FROM public.rpt_trx
where (event_source = 'проходная вход №1' or
event_source = 'проходная вход №2' or
event_source = 'проходная вход №3') and
event_type='Разрешение на вход' and
(cast((to_timestamp(event_date) at time zone 'UTC') as time) between time '$time_start' and time '$time_end') and
(cast((to_timestamp(event_date) at time zone 'UTC') as date) = date '$date')
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751506
Garred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чёрт, не туда нажал, я ещё не всё xD
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751508
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
	identity_id as id,
	to_timestamp(event_date) at time zone 'UTC' as Дата, 
	fio as ФИО, 
	department as Отделение, 
	rank as Должность,
	event_source as Место
from
	(select 
		*
		,row_number()over(partition by identity_id order by event_date) as rn 
	from public.rpt_trx 
	where	cast((to_timestamp(event_date) at time zone 'UTC') as date) = date '$date' 
		and event_type='Разрешение на вход' 
		and event_source in ('проходная вход №1','проходная вход №2','проходная вход №3')) t
where	rn=1 
	and (cast((to_timestamp(event_date) at time zone 'UTC') as time) between time '$time_start' and time '$time_end')
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751509
Garred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Select *
from (SELECT identity_id as id, 
                     to_timestamp(event_date) at time zone 'UTC' as Дата, 
                     fio as ФИО, 
		     department as Отделение, 
		     rank as Должность,
		     event_source as Место,
                     row_number() over (partition by identity_id order by event_date) as RN
         FROM public.rpt_trx
         where (event_source = 'проходная вход №1' or
                   event_source = 'проходная вход №2' or
                   event_source = 'проходная вход №3') and
                   event_type='Разрешение на вход' and
          (cast((to_timestamp(event_date) at time zone 'UTC') as date) = date '$date')) as query
where RN = 1
...
Рейтинг: 0 / 0
Выборки опоздавших
    #39751510
Garred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, а, понял благодарю!
неудобно в первый раз на форуме...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборки опоздавших
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]