Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разложить на получасовые отрезки работу конвейера... сложная задачка / 7 сообщений из 7, страница 1 из 1
05.08.2019, 14:49
    #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
05.08.2019, 15:06
    #39845414
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить на получасовые отрезки работу конвейера... сложная задачка
хорошо я согласен,

джойн к таблице "отрезков" и группировка
...
Рейтинг: 0 / 0
05.08.2019, 15:20
    #39845423
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разложить на получасовые отрезки работу конвейера... сложная задачка
Не вижу связи между тестовыми данными и тестовой результирующей табличкой
...
Рейтинг: 0 / 0
05.08.2019, 15:28
    #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
05.08.2019, 15:28
    #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
06.08.2019, 05:27
    #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
06.08.2019, 10:14
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разложить на получасовые отрезки работу конвейера... сложная задачка / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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