Как получить процент подсчета при отфильтрованном выборе записей из таблицы

#sql #sql-server #sql-server-2008

Вопрос:

Наличие схемы (Perf_Stat), которая заполняется статистикой производительности за определенный период времени, как:

 Event              Event_Ts         Event_Stat
------------------------------------------
Entry        2021-02-15 19:30:10       Success
Update       2021-02-15 19:35:10       Success
Delete       2021-02-15 19:23:10       Failure
Update       2021-02-15 19:68:10       Success
Delete       2021-02-15 18:30:10       Failure
Update       2021-02-15 18:59:10       Success
and so no.....
 

Мне нужно получить подсчет в процентах неудачных событий обновления из этой таблицы за каждый последний час при каждом выполнении. Нравится

при следующем запуске он должен дать мне результат в виде:

 **23%** (Which denotes 23% of the total **Update** events that failed in the last hour)
 

То, что я пытался и потерпел неудачу, — это :

 SELECT COUNT
(
    (
        (SELECT COUNT(*) FROM Perf_Stat WHERE Event = 'Update' AND DATEDIFF(hour, Event_Ts, GETDATE() < 1) AND Event_Stat = 'Failure') * 100
    ) / 
    (
        SELECT COUNT(*) FROM Perf_Stat WHERE Event = 'Update' AND DATEDIFF(hour, Event_Ts, GETDATE() < 1)
    )
) from Perf_Stat;
 

но я получаю ошибки агрегатной функции. Пожалуйста, подскажите, как получить желаемый результат.

Комментарии:

1. Вам нужен только последний час или вы хотите объединить его по всей таблице по часам? И является ли начало и конец часа в час: 1:00, 2:00, или это было ровно час назад, скажем, 1:07, 2:07

2. Это точно последний час.

3. Тогда второй ответ Гордона сработает для вас

Ответ №1:

Мне нужно получить подсчет в процентах неудачных событий обновления из этой таблицы за каждый последний час при каждом выполнении.

Я бы подошел к этому так:

 SELECT AVG(CASE WHEN Event = 'Update' THEN 1.0 ELSE 0 END)
FROM FROM Perf_Stat
WHERE DATEDIFF(hour, Event_Ts, GETDATE()) < 1;
 

Я предполагаю, что сравнение времени-это то, что вам действительно нужно, — последний полный час. В течение последнего часа я бы использовал:

 WHERE Event_Ts >= DATEADD(hour, -1, GETDATE())
 

Комментарии:

1. Мне нужно, чтобы количество отображалось в процентах, будет ли это делать AVG ()?

2. @Аашу… Да, это будет до тех пор, пока вы используете 1.0 и не 1

3. @Aashu… . . . Это дает значение в виде числа от 0 до 1-соотношение. Вы можете использовать 100.0 вместо 1.0 этого, чтобы получить значение от 0 до 100.