DB2 Query Top Group от
Вопрос
Я пытался часами, но не могу получить запрос, я хочу сделать следующее, используя DB2. От табличных компаний и пользователей у меня есть следующая информация о билетах по компании/пользователю
QUERY USING:
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC
Результат:
user company quantity
----------------------------------
mark nissn 300
tom toyt 50
steve kryr 80
mark frd 20
tom toyt 120
jose toyt 230
tom nissn 145
steve toyt 10
jose kryr 35
steve frd 100
Это должно быть результатом (лучшего пользователя на компанию)
user company quantity
----------------------------------
mark nissn 300
jose toyt 230
steve frd 100
steve kryr 80
Как видите, в компании есть много пользователей, и каждый из них имеет разные количества на одну компанию, результат должен получить пользователя с самым высоким количеством на одну компанию. т.е. Компания nissn
У него есть 2 пользователя, и у каждого есть (Марк с 300) и (Том с 145)
Так что это должно дать мне самый высокий пользователь, который будет отмечать с 300. То же самое было бы для toyt
, frd
, kryr
. Анкет Мне нужны все из них в запросе.
Интересно, возможно ли это в запросе, или мне нужно будет создать хранимую процедуру.
Решение
Вы можете сделать это с аналитические запросы. Анкет Но будь осторожен. Образец обычно работает для участия вложенных подразделений. (Один для создания набора данных, а следующий, чтобы добавить его в шаблон, третий, чтобы выбрать желаемые ряды.)
В этом случае это должно выглядеть примерно так.
Оригинальный запрос.
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
Аналитический запрос. (Обратите внимание, что s
это назвать подложку. Я не использовал DB2, но стандарт строго не мешает их отбросить, и я знаю, по крайней мере, одну базу данных, которая требует их.)
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s
Конечный результат.
SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1
Объединенный запрос:
SELECT user, quantity, company
FROM (
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM (
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
) s
) t
WHERE r = 1
Как я говорю, я не использовал DB2. Но, согласно стандарту SQL, этот запрос должен работать.