Классифицировать ошибки в соответствии с критериями таблицы - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно классифицировать ошибки в зависимости от того, сколько раз они произошли за промежуток времени. Я сделал категории «A», «B» и «C», чтобы указать, как часто возникает ошибка. Также у меня есть категория «Z», если ошибка не возникает достаточно часто, чтобы соответствовать критериям «A», «B» и «C». Обратите внимание, что пользователь может добавить столько категорий, сколько он хочет («D», «E», «F» и т. Д.)

Я сделал запрос, который почти дает правильный результат, но мне нужно отфильтровать критерии, которые являются «нисходящими» в порядке критериев, потому что некоторые ошибки будут соответствовать нескольким критериям.

Таблица:

errors
ErrorNo ErrorName
1       'Error 1'
2       'Error 2'
3       'Error 3'
4       'Error 4'

errorLog
errorNo timestamp
1       2019-04-26  --1 time each day the last 6 days
1       2019-04-25
1       2019-04-24
1       2019-04-23
1       2019-04-22
1       2019-04-21

2       2019-04-26  --3 times today
2       2019-04-26
2       2019-04-26

3       2019-04-26
3       2019-03-26  --1 month ago

errorCategoryTypes
categoryName    months  minErrorCnt
A               1       6       --means at least 6 times the last 1 month
B               1       2       --means at least 2 times the last 1 month
C               3       1       --means at least 1 times the last 3 month

Запрос Sql:

select errors.errorNo
, case when category.categoryName is not null then category.categoryName else 'Z' end
from errors
left join (
    select errorNo, categoryName
    from errorLog
    join errorCategoryTypes on errorLog.timestamp between DATEADD(day,-(errorCategoryTypes.months * 30),getdate()) and GETDATE()
    group by errorNo, categoryName, errorCategoryTypes.minErrorCnt
    having COUNT(errorLog.id) >= errorCategoryTypes.minErrorCnt
) category on errors.errorNo = category.errorNo
group by errors.errorNo, category.categoryName

Это приводит к следующему результату, потому что «Ошибка 1» фактически соответствует всем критериям «А», «В» и «С», а «В» соответствует как «В», так и «С». Но как мне остановить вычисление, когда оно подойдет?

ErrorNo Category

1       A           
1       B           
1       C           
2       B
2       C           
3       C           
4       Z           

Мне нужен следующий результат

ErrorNo Category

1       A           --because error 1 occures at least 6 times during the last 1 month
2       B           --because error 2 occures at least 2 times during the last 1 month
3       C           --because error 3 occures at least 1 time during the last 3 months
4       Z           --because error 4 does not fit A, B or C category criterias

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете использовать оконные функции:

select e.errorno, e.categoryName
from (select e.errorno, e.categoryName,
             count(*) as applicable_errors,
             row_number() over (partition by e.errorno order by e.categoryName) as seqnum
      from error e left join
           errorlog el
           on el.errorno = e.errorno left join
           errorCategoryTypes ect
           on el.timestamp >= dateadd(month, - ect.months, getdate())
      group by e.errorno, e.categoryName, e.
      having count(*) >= minErrorCnt
     ) e
where seqnum = 1;

Примечание. При оформлении заказа необходимо использовать название категории.У вас должен быть приоритетный столбец в таблице типов ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...