Мне нужно рассчитать количество последовательных часов, в течение которых трансформатор перегружен. Трансформатор может быть определен как перегруженный путем деления использования на размер и умножения его на 100, чтобы получить процент. Таблица поиска перегрузки содержит параметры для расчета. Это нужно делать динамически, поэтому я не усердно кодирую его в запросе, если мне нужно добавить больше параметров или изменить текущие параметры. Если трансформатор перегружен на 150-174,99 процента в течение четырех и более часов, он будет считаться перегруженным. Если трансформатор перегружен на 175-199,99% в течение двух или более часов, он будет считаться перегруженным, а если трансформатор перегружен на 200 или более процентов в течение одного часа или более, чем он также будет считаться перегруженным. Result Set 1 имеет почти желаемый результат. Обратите внимание на предостережение в третьем ряду. Тот же запрос использовался для вычисления Result Set 2 Набор результатов правильный, если запрос выполняется только для этого дня и для этого преобразователя. Когда я убрал предложение where на трансформаторе и дату, расчеты пошли не так. Мне нужно, чтобы это можно было запускать для большого числа или результатов, поэтому ограничение результатов или создание функции не будет работать. На выходе все неправильно.
В конце концов мне нужно взять эти данные и показать, что трансформатор # был перегружен [n] количество раз в течение одного дня за [n] количество часов. Результирующий набор 1 должен показать, что трансформатор 318 был перегружен 1 раз в течение 7 часов. Если должна была произойти другая последовательность перегрузок, начиная с 12-го часа и продолжаться в течение четырех часов, то агрегированные результаты должны показать, что трансформатор был перегружен 2 раза в общей сложности за 11 часов. Когда я углубляюсь в эти данные из отчета, я хочу увидеть, какие наборы результатов представлены ниже.
Запрос
DROP TABLE #TransformerLoading;
DROP TABLE #OverloadLookup;
CREATE TABLE #TransformerLoading(
TransformerID int,
[Date] date,
Size int,
Usage decimal,
[Hour] int,
OverloadPercent decimal
);
INSERT INTO #TransformerLoading
VALUES
(318, '2019-01-11', 5.00, 7.3728, 1, 147.00),
(318, '2019-01-11', 5.00, 8.2944, 2, 166.00),
(318, '2019-01-11', 5.00, 7.3728, 3, 147.00),
(318, '2019-01-11', 5.00, 7.9872, 4, 160.00),
(318, '2019-01-11', 5.00, 8.6016, 5, 172.00),
(318, '2019-01-11', 5.00, 7.9872, 6, 160.00),
(318, '2019-01-11', 5.00, 9.6000, 7, 192.00),
(318, '2019-01-11', 5.00, 7.9872, 8, 160.00),
(318, '2019-01-11', 5.00, 8.4480, 9, 169.00),
(318, '2019-01-11', 5.00, 7.5264, 10, 151.00),
(318, '2019-01-11', 5.00, 7.0656, 11, 141.00),
(318, '2019-01-11', 5.00, 7.8336, 12, 157.00),
(318, '2019-01-11', 5.00, 6.6048, 13, 132.00),
(318, '2019-01-11', 5.00, 6.2976, 14, 126.00),
(318, '2019-01-11', 5.00, 6.6048, 15, 132.00),
(318, '2019-01-11', 5.00, 6.6048, 16, 132.00),
(318, '2019-01-11', 5.00, 6.4512, 17, 129.00),
(318, '2019-01-11', 5.00, 5.5296, 18, 111.00),
(318, '2019-01-11', 5.00, 5.0688, 19, 101.00),
(318, '2019-01-11', 5.00, 5.2224, 20, 104.00),
(318, '2019-01-11', 5.00, 6.1440, 21, 123.00),
(318, '2019-01-11', 5.00, 6.2976, 22, 126.00),
(318, '2019-01-11', 5.00, 3.6864, 23, 74.00),
(318, '2019-01-11', 5.00, 3.6864, 24, 74.00),
(3403, '2019-01-11', 15.00, 146.7000, 1, 978.00),
(3403, '2019-01-11', 15.00, 147.1500, 2, 981.00),
(3403, '2019-01-11', 15.00, 146.7000, 3, 978.00),
(3403, '2019-01-11', 15.00, 147.6000, 4, 984.00),
(3403, '2019-01-11', 15.00, 146.7000, 5, 978.00),
(3403, '2019-01-11', 15.00, 147.6000, 6, 984.00),
(3403, '2019-01-11', 15.00, 147.6000, 7, 984.00),
(3403, '2019-01-11', 15.00, 147.6000, 8, 984.00),
(3403, '2019-01-11', 15.00, 147.6000, 9, 984.00),
(3403, '2019-01-11', 15.00, 147.1500, 10, 981.00),
(3403, '2019-01-11', 15.00, 145.8000, 11, 972.00),
(3403, '2019-01-11', 15.00, 144.9000, 12, 966.00),
(3403, '2019-01-11', 15.00, 145.8000, 13, 972.00),
(3403, '2019-01-11', 15.00, 145.3500, 14, 969.00),
(3403, '2019-01-11', 15.00, 144.9000, 15, 966.00),
(3403, '2019-01-11', 15.00, 126.9000, 16, 846.00),
(3403, '2019-01-11', 15.00, 114.7500, 17, 765.00),
(3403, '2019-01-11', 15.00, 114.3000, 18, 762.00),
(3403, '2019-01-11', 15.00, 115.2000, 19, 768.00),
(3403, '2019-01-11', 15.00, 112.9500, 20, 753.00),
(3403, '2019-01-11', 15.00, 112.5000, 21, 750.00),
(3403, '2019-01-11', 15.00, 112.9500, 22, 753.00),
(3403, '2019-01-11', 15.00, 112.9500, 23, 753.00),
(3403, '2019-01-11', 15.00, 112.9500, 24, 753.00)
;
CREATE TABLE #OverloadLookup(
[Hours] int,
MinPercent decimal,
MaxPercent decimal
);
insert into #OverloadLookup
VALUES
(4,150,174.99),
(2,175,199.99),
(1,200,99999.99)
;
with a as (
select *
,row_number() OVER (Order by date, [hour]) RowNumber,
case when [hours] is null then 0 else 1 end IsOverloaded,
row_number() over (partition by transformerid, date, case when [hours] is null then 0 else 1 end order by date, [hour]) PartitionedRowNumber,
GroupByRowNumber = row_number() OVER (Order by date, [hour]) - row_number() over (partition by transformerid, date, case when [hours] is null then 0 else 1 end order by date, [hour])
from #TransformerLoading tl
left join #OverloadLookup ol on tl.OverloadPercent between ol.MinPercent and ol.MaxPercent
where tl.Date = '1/11/2019' --and tl.TransformerID = 3403
)
select TransformerID, date, size, usage, hour, OverloadPercent, [Hours], MinPercent, MaxPercent, IsOverloaded,
ROW_NUMBER() OVER (Partition by GroupByRowNumber ORDER BY GroupBYROWNUMBER, [Hour]) ConsecutiveCount
FROM a
order by TransformerID, Date, Hour
OverloadLookup
Hours MinPercent MaxPercent
4 150 174.99
2 175 199.99
1 200 99999.99
Результирующий набор 1
TransformerID date size usage hour OverloadPercent Hours MinPercent MaxPercent IsOverloaded ConsecutiveCount
318 2019-01-11 5.00 7.3728 1 147.00 NULL NULL NULL 0 1
318 2019-01-11 5.00 8.2944 2 166.00 4 150 174.99 1 1
318 2019-01-11 5.00 7.3728 3 147.00 NULL NULL NULL 0 2 (This needs to be one)
318 2019-01-11 5.00 7.9872 4 160.00 4 150 174.99 1 1
318 2019-01-11 5.00 8.6016 5 172.00 4 150 174.99 1 2
318 2019-01-11 5.00 7.9872 6 160.00 4 150 174.99 1 3
318 2019-01-11 5.00 9.6000 7 192.00 2 175 199.99 1 4
318 2019-01-11 5.00 7.9872 8 160.00 4 150 174.99 1 5
318 2019-01-11 5.00 8.4480 9 169.00 4 150 174.99 1 6
318 2019-01-11 5.00 7.5264 10 151.00 4 150 174.99 1 7
318 2019-01-11 5.00 7.0656 11 141.00 NULL NULL NULL 0 1
318 2019-01-11 5.00 7.8336 12 157.00 4 150 174.99 1 1
318 2019-01-11 5.00 6.6048 13 132.00 NULL NULL NULL 0 1
318 2019-01-11 5.00 6.2976 14 126.00 NULL NULL NULL 0 2
318 2019-01-11 5.00 6.6048 15 132.00 NULL NULL NULL 0 3
318 2019-01-11 5.00 6.6048 16 132.00 NULL NULL NULL 0 4
318 2019-01-11 5.00 6.4512 17 129.00 NULL NULL NULL 0 5
318 2019-01-11 5.00 5.5296 18 111.00 NULL NULL NULL 0 6
318 2019-01-11 5.00 5.0688 19 101.00 NULL NULL NULL 0 7
318 2019-01-11 5.00 5.2224 20 104.00 NULL NULL NULL 0 8
318 2019-01-11 5.00 6.1440 21 123.00 NULL NULL NULL 0 9
318 2019-01-11 5.00 6.2976 22 126.00 NULL NULL NULL 0 10
318 2019-01-11 5.00 3.6864 23 74.00 NULL NULL NULL 0 11
318 2019-01-11 5.00 3.6864 24 74.00 NULL NULL NULL 0 12
Результирующий набор 2
TransformerID date size usage hour OverloadPercent Hours MinPercent MaxPercent IsOverloaded ConsecutiveCount
3403 2019-01-11 15.00 146.7000 1 978.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 147.1500 2 981.00 1 200 9999999.00 1 1 (This needs to be two)
3403 2019-01-11 15.00 146.7000 3 978.00 1 200 9999999.00 1 1 (This needs to be three)
3403 2019-01-11 15.00 147.6000 4 984.00 1 200 9999999.00 1 1 (ect...)
3403 2019-01-11 15.00 146.7000 5 978.00 1 200 9999999.00 1 3
3403 2019-01-11 15.00 147.6000 6 984.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 147.6000 7 984.00 1 200 9999999.00 1 3
3403 2019-01-11 15.00 147.6000 8 984.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 147.6000 9 984.00 1 200 9999999.00 1 3
3403 2019-01-11 15.00 147.1500 10 981.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 145.8000 11 972.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 144.9000 12 966.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 145.8000 13 972.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 145.3500 14 969.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 144.9000 15 966.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 126.9000 16 846.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 114.7500 17 765.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 114.3000 18 762.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 115.2000 19 768.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 112.9500 20 753.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 112.5000 21 750.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 112.9500 22 753.00 1 200 9999999.00 1 2
3403 2019-01-11 15.00 112.9500 23 753.00 1 200 9999999.00 1 1
3403 2019-01-11 15.00 112.9500 24 753.00 1 200 9999999.00 1 2