Как подсчитать количество элементов в сгруппированном запросе и отобразить Top (x)? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь отобразить наибольшее количество ошибок из результатов группы по запросу

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

SELECT Code AS Module
   , ErrCode As ErrorCode
   , Count(ErrCode) AS ErrorCount
   , CAST([Msg-EN] as varchar(max)) as ErrorMsg
FROM ViewAllAlarm
WHERE RiseTime >= DateAdd(Hour, -12, GetDate())
GROUP BY Code, ErrCode,  CAST([Msg-EN] as varchar(max))
Order by Module ASC

Результат:

Module | ErrorCode | ErrorCount | ErrorMsg
-------+-----------+------------+---------
F108   | 194       |        127 | Error2
F108   | 358       |        209 | Error1
F109   | 129       |         11 | Error3
F110   | 129       |        200 | Error3
F110   | 358       |        300 | Error1
F111   | 358       |          2 | Error1
F111   | 129       |          5 | Error3
F112   | 129       |         12 | Error3
F113   | 358       |        200 | Error1
F114   | 194       |        300 | Error2

Теперь мне нужно подсчитать количество ошибок (ErrorCount) по модулям и отобразить модули с наибольшим количеством (топ 5).

Это дает 336 ошибок для F108, 11 для F109, 500 для F110 и т. Д. Я хочу показать пять модулей с наибольшим количеством ошибок: F110 (500), F108 (336), F114 (300), F113 (200), F112 (12). Модули F129 (11) и F111 (7) не должны отображаться.

Module | ErrorCode | ErrorCount | ErrorMsg
-------+-----------+------------+---------
F108   | 194       |        127 | Error2
F108   | 358       |        209 | Error1
F110   | 129       |        200 | Error3
F110   | 358       |        300 | Error1
F112   | 129       |         12 | Error3
F113   | 358       |        200 | Error1
F114   | 194       |        300 | Error2

Это на сервере MS 2016 SQL.

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Используйте предложение IN, чтобы выбрать только те модули с наибольшим количеством ошибок.

WITH current AS
(
  SELECT *
  FROM viewallalarm
  WHERE risetime >= DATEADD(HOUR, -12, GETDATE())
)
SELECT
    code AS module
  , errcode As errorcode
  , COUNT(*) AS errorcount
  , MAX(CAST([Msg-EN] as VARCHAR(MAX))) AS errormsg
FROM current
WHERE module IN
(
  SELECT TOP(5) WITH TIES code
  FROM current
  GROUP BY code
  ORDER BY COUNT(*) DESC
)
GROUP BY code, errcode
ORDER BY module;

Или используйте оконные функции:

SELECT *
FROM
(
  SELECT TOP(5) WITH TIES *
  FROM
  (
    SELECT
        code AS module
      , errcode As errorcode
      , COUNT(*) AS errorcount
      , CAST([Msg-EN] as VARCHAR(MAX)) AS errormsg
      , SUM(COUNT(*)) OVER(PARTITION BY code) AS total
    FROM viewallalarm
    WHERE risetime >= DATEADD(HOUR, -12, GETDATE())
    GROUP BY code, errcode, CAST([Msg-EN] AS VARCHAR(MAX))
  ) summed
  ORDER BY DENSE_RANK() OVER (ORDER BY total DESC)
) top_five
ORDER BY module;
0 голосов
/ 04 апреля 2019

если мой sql, тогда используйте предел

select Code AS Module, count(*) as cnt
FROM ViewAllAlarm
WHERE RiseTime >= DateAdd(Hour, -12, GetDate())
GROUP BY Code
ORDER BY COUNT(*) DESC limit 5
0 голосов
/ 04 апреля 2019

Хммм.Если вам просто нужны модули, тогда используйте group by и top:

SELECT TOP (5) Code AS Module, COUNT(*) as cnt
FROM ViewAllAlarm
WHERE RiseTime >= DateAdd(Hour, -12, GetDate())
GROUP BY Code
ORDER BY COUNT(*) DESC;

Если вы хотите также ошибки, вы могли бы что-то выяснить с помощью оконных функций, но я думаю, что простое объединение можетбудь проще:

select vaa.*
from ViewAllAlarm vaa join
     (SELECT TOP (5) Code, COUNT(*) as cnt
      FROM ViewAllAlarm
      WHERE RiseTime >= DateAdd(Hour, -12, GetDate())
      GROUP BY Code
      ORDER BY COUNT(*) DESC
     ) t5
     on t5.code = vaa.code;
...