powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно сгруппировать данные и получить правильный график
4 сообщений из 4, страница 1 из 1
Как правильно сгруппировать данные и получить правильный график
    #39840181
Vincent_low92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток. Дорогие друзья, помогите, пожалуйста с такой проблемой.

Есть выгрузка из бд такого рода.

Агент Статус Начало (время вхождения в статус) Конец (время выхода из статуса) Ваня Вышел 21.06.2019 19:55 22.06.2019 13:55Ваня Готов 22.06.2019 13:55 22.06.2019 13:58Ваня Готов 22.06.2019 13:58 22.06.2019 13:59Ваня Обрабатывает 22.06.2019 13:59 22.06.2019 14:02Ваня Перерыв 22.06.2019 14:02 22.06.2019 14:10Ваня Готов 22.06.2019 14:10 22.06.2019 14:15Ваня Обрабатывает 22.06.2019 14:15 22.06.2019 14:18

Необходимо сделать подсчет времени нахождения в каждом статусе и начало смены.
Все сделал кроме смен, подсчитать и сгруппировать легко. но вот столкнулся с такой проблемой. Данные записываются так как выше указал. Статус "вышел", говорит, что пользователь закрыл программу, а значит смена закончилась, что показывает колонка "начало", а колонка "Конец" говорит о том что он вышел из этого статуса (то есть вошел в систему). У тех у кого смена в одном дне, я могу выгрузить, просто так же группирую и нахожу первый и последний статус. Но вот когда у агента рабочий график допустим с 19 до 07, то тут проблема уже есть. Ведь мне надо сгруппировать по рабочему дню. А тут смена затрагивает сразу 2 дня, как мне получить нужные мне данный.

Грубо говоря, что есть сейчас. Я считаю общее время нахождения в статусах, за дату беру первый статус и время вхождения в него (То есть самый первый статус "готов" 22.06.2019 ) группирую по дате и агенту записи и если в этот день я встречаю первый и последний статус то все ок. Но если агент работал после 00:00, значит день новый и подсчет уже идет по другому, как новая запись.

Как мне надо построить логику запроса? я не могу думать на sql(
...
Рейтинг: 0 / 0
Как правильно сгруппировать данные и получить правильный график
    #39840209
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vincent_low92Как мне надо построить логику запроса? я не могу думать на sql(
SQL пока тут не причём (можно хоть в Excel и пр.)
для начала неплохо-бы определится с задачами,
т.к. например время нахождения в каждом статусе можно предположить что будет = конец-начало
а с началом смены - тут уже чисто от бизнеса зависит
как только будет определено что считать началом смены
(кроме колонны "начало" - не хватает другой логики, например необходимый "статус" и т.д.)
то и дальше можно уже решать в зависимости от определений.

с графиком - такая-же ерунда: нужно поставить цели что и как нужно отображать,
в зависимости от них будут правильные и неправильные пути реализации
...
Рейтинг: 0 / 0
Как правильно сгруппировать данные и получить правильный график
    #39840215
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
set language russian;

declare @t table (agent varchar(30), state varchar(30), state_start datetime, state_end datetime);
insert into @t
values
('Ваня', 'Вышел', '21.06.2019 19:55', '22.06.2019 13:55'),
('Ваня', 'Готов', '22.06.2019 13:55', '22.06.2019 13:58'),
('Ваня', 'Готов', '22.06.2019 13:58', '22.06.2019 13:59'),
('Ваня', 'Обрабатывает', '22.06.2019 13:59', '22.06.2019 14:02'),
('Ваня', 'Перерыв', '22.06.2019 14:02', '22.06.2019 14:10'),
('Ваня', 'Готов', '22.06.2019 14:10', '22.06.2019 14:15'),
('Ваня', 'Обрабатывает', '22.06.2019 14:15', '22.06.2019 14:18'),
('Ваня', 'Обрабатывает', '23.06.2019 14:15', '23.06.2019 14:18'),

('Ваня', 'Вышел', '21.07.2020 19:55', '23.07.2020 13:55'),
('Ваня', 'Готов', '23.07.2020 13:55', '23.07.2020 13:58'),
('Ваня', 'Готов', '23.07.2020 13:58', '23.07.2020 13:59'),
('Ваня', 'Обрабатывает', '23.07.2020 13:59', '23.07.2020 14:02'),
('Ваня', 'Перерыв', '23.07.2020 14:02', '23.07.2020 14:10'),
('Ваня', 'Готов', '23.07.2020 14:10', '23.07.2020 14:15'),
('Ваня', 'Обрабатывает', '23.07.2020 14:15', '23.07.2020 14:18');

with t as
(
 select
  agent, state, state_end as session_start,
  lead(state_start, 1, '99991231') over (partition by agent order by state_end) as session_end
 from
  @t
 where
  state = 'Вышел'
)
select
 a.agent, a.session_start, b.state, sum(datediff(mi, b.state_start, b.state_end))
from
 t a join
 @t b on b.agent = a.agent and b.state_start > a.session_start and b.state_end < a.session_end
group by
 a.agent, a.session_start, b.state;
...
Рейтинг: 0 / 0
Как правильно сгруппировать данные и получить правильный график
    #39840516
Vincent_low92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно сгруппировать данные и получить правильный график
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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