powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разложить на получасовые отрезки работу конвейера... сложная задачка
7 сообщений из 7, страница 1 из 1
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845408
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут задавал вопрос, пытаясь задачу решить самому. Но что-то никак.

Есть таблица работы конвейера. Работает он круглосуточно, но для простоты пусть с 6 утра до полуночи. Что-то на нём делают, останавливают, меняют продукцию, снова запускают.
Состояние бригада времязапуск 1 11.02.2018 6:10простой 1 11.02.2018 9:40запуск 1 11.02.2018 9:55простой 1 11.02.2018 13:30запуск 1 11.02.2018 14:10простой 1 11.02.2018 23:12запуск 1 12.02.2018 6:05простой 1 12.02.2018 8:30запуск 1 12.02.2018 8:55простой 1 12.02.2018 12:20запуск 1 12.02.2018 15:50простой 1 12.02.2018 23:58
Задача вывести эту таблицу в виде
Дата отрезок время работы(мин)11.02.2018 6:00 2011.02.2018 6:30 3011.02.2018 7:00 3011.02.2018 7:30 3011.02.2018 8:00 3011.02.2018 8:30 3011.02.2018 9:00 3011.02.2018 9:30 15
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845414
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласен,

джойн к таблице "отрезков" и группировка
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845423
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу связи между тестовыми данными и тестовой результирующей табличкой
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845431
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласен,

Код: 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.
40.
declare @t table
(
state_name nvarchar(100),
team_id int,
dt datetime
);

insert into @t (state_name,team_id, dt)
values
('запуск' , 1, convert(datetime, '11.02.2018 6:10' , 104)),
('простой', 1, convert(datetime, '11.02.2018 9:40' , 104)),
('запуск' , 1, convert(datetime, '11.02.2018 9:55' , 104)),
('простой', 1, convert(datetime, '11.02.2018 13:30', 104)),
('запуск' , 1, convert(datetime, '11.02.2018 14:10', 104)),
('простой', 1, convert(datetime, '11.02.2018 23:12', 104)),
('запуск' , 1, convert(datetime, '12.02.2018 6:05' , 104)),
('простой', 1, convert(datetime, '12.02.2018 8:30' , 104)),
('запуск' , 1, convert(datetime, '12.02.2018 8:55' , 104)),
('простой', 1, convert(datetime, '12.02.2018 12:20', 104)),
('запуск' , 1, convert(datetime, '12.02.2018 15:50', 104)),
('простой', 1, convert(datetime, '12.02.2018 23:58', 104));

with periods as (
select *, lead(dt) over (partition by team_id order by dt) as dt_to
from @t),
calendar as 
(
select cast('20180211 06:00' as datetime) as dt, cast('20180211 06:30' as datetime) as dt_to
union all
select  dateadd(mi, 30, dt) as dt, dateadd(mi, 30, dt_to) as dt_to 
from    calendar
where   dateadd(mi, 30, dt) < '20180212'
)
select c.dt, sum(datediff(mi, iif(c.dt > p.dt, c.dt, p.dt), iif(c.dt_to > p.dt_to, p.dt_to, c.dt_to)))
from calendar c
        left  join periods p
                on state_name = 'запуск' 
                and p.dt < c.dt_to 
                and p.dt_to > c.dt
group by c.dt



Для реального применения календарь желательно в отдельную таблицу вынести.
Окончание считается исходя из условия, что дубли вы уже удалили.
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845432
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Не вижу связи между тестовыми данными и тестовой результирующей табличкой
в исходных данных:
в 6:10 конвейер запустили, в 9:40 остановили для переналадки.
Т.е.
с 6:00 до 6:29 он работал всего 20 минут.
с 6:30 до 6:59 он работал всего 50 минут.
...
с 9:30 до 9:59 он работал всего 10 минут, затем ещё 5. Т.е. 15.
И т.д.
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845639
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простой это вам не сложный,

Состояние бригада времястарт 1 11.02.2018 6:10стоп 1 11.02.2018 9:40старт 1 11.02.2018 9:55стоп 1 11.02.2018 13:30старт 1 11.02.2018 14:10стоп 1 11.02.2018 23:12старт 1 12.02.2018 6:05стоп 1 12.02.2018 8:30старт 1 12.02.2018 8:55стоп 1 12.02.2018 12:20старт 1 12.02.2018 15:50стоп 1 12.02.2018 23:58

Дата отрезок время работы(мин)6:00
отрезок только ничего в реальном мире выражается одной точкой

Дата начало отрезка конец отрезкавремя работы(мин)6:006:30
так сразу понятнее будет что надо делать
...
Рейтинг: 0 / 0
Разложить на получасовые отрезки работу конвейера... сложная задачка
    #39845706
AlexKM2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так ещё )))

Код: 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.
declare @t table
(
ID int identity(1,1),
state_name nvarchar(100),
team_id int,
dt datetime
);

insert into @t (state_name,team_id, dt)
values
('запуск' , 1, convert(datetime, '05.08.2019 6:10' , 104)),
('останов', 1, convert(datetime, '05.08.2019 9:40' , 104)),
('запуск' , 1, convert(datetime, '05.08.2019 9:55' , 104)),
('останов', 1, convert(datetime, '05.08.2019 13:30', 104)),
('запуск' , 1, convert(datetime, '05.08.2019 14:10', 104)),
('останов', 1, convert(datetime, '05.08.2019 23:12', 104)),
('запуск' , 1, convert(datetime, '06.08.2019 6:05' , 104)),
('останов', 1, convert(datetime, '06.08.2019 8:30' , 104)),
('запуск' , 1, convert(datetime, '06.08.2019 8:55' , 104)),
('останов', 1, convert(datetime, '06.08.2019 12:20', 104)),
('запуск' , 1, convert(datetime, '06.08.2019 15:50', 104)),
('останов', 1, convert(datetime, '06.08.2019 23:58', 104));

select t1.ID
      ,datediff(minute, t1.dt, isnull(t2.dt, cast(cast(getdate()+1 as date) as datetime))) as 'время работы'
	  ,t1.dt as 'запуск'
	  ,isnull(t2.dt, cast(cast(getdate()+1 as date) as datetime)) as 'останов'
from @t t1
left join @t t2
  on t1.ID = t2.ID - 1
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разложить на получасовые отрезки работу конвейера... сложная задачка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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