Мне нужно классифицировать ошибки в зависимости от того, сколько раз они произошли за промежуток времени.
Я сделал категории «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