Подсчет последовательных строк на основе расчета - PullRequest
0 голосов
/ 24 января 2019

Мне нужно рассчитать количество последовательных часов, в течение которых трансформатор перегружен. Трансформатор может быть определен как перегруженный путем деления использования на размер и умножения его на 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
...