Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 384
Я тут задавал вопрос, пытаясь задачу решить самому. Но что-то никак.

Есть таблица работы конвейера. Работает он круглосуточно, но для простоты пусть с 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 20
11.02.2018 6:30 30
11.02.2018 7:00 30
11.02.2018 7:30 30
11.02.2018 8:00 30
11.02.2018 8:30 30
11.02.2018 9:00 30
11.02.2018 9:30 15


Сообщение было отредактировано: 5 авг 19, 14:58
5 авг 19, 14:49    [21942112]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2394
хорошо я согласен,

джойн к таблице "отрезков" и группировка
5 авг 19, 15:06    [21942130]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Не вижу связи между тестовыми данными и тестовой результирующей табличкой
5 авг 19, 15:20    [21942150]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
хорошо я согласен,

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


Для реального применения календарь желательно в отдельную таблицу вынести.
Окончание считается исходя из условия, что дубли вы уже удалили.
5 авг 19, 15:28    [21942162]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 384
982183
Не вижу связи между тестовыми данными и тестовой результирующей табличкой

в исходных данных:
в 6:10 конвейер запустили, в 9:40 остановили для переналадки.
Т.е.
с 6:00 до 6:29 он работал всего 20 минут.
с 6:30 до 6:59 он работал всего 50 минут.
...
с 9:30 до 9:59 он работал всего 10 минут, затем ещё 5. Т.е. 15.
И т.д.
5 авг 19, 15:28    [21942163]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
PizzaPizza
Member

Откуда:
Сообщений: 365
простой это вам не сложный,

Состояние бригада время
старт 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

так сразу понятнее будет что надо делать
6 авг 19, 05:27    [21942560]     Ответить | Цитировать Сообщить модератору
 Re: Разложить на получасовые отрезки работу конвейера... сложная задачка  [new]
AlexKM2020
Member

Откуда:
Сообщений: 19
Можно так ещё )))

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
6 авг 19, 10:14    [21942652]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить