верхняя группа запроса db2 по - PullRequest
2 голосов
/ 14 июня 2011

Я пытался часами, но не могу получить запрос, я хочу сделать следующее, используя 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. Мне нужны все из них в запросе.
Интересно, возможно ли это в запросе, или мне нужно будет создать хранимую процедуру.

1 Ответ

6 голосов
/ 14 июня 2011

Вы можете сделать это с помощью аналитических запросов .Но будь осторожен.Шаблон обычно работает с вложенными подзапросами.(Один для создания набора данных, следующий для добавления его к шаблону, третий для выбора нужных строк.)

В этом случае он должен выглядеть примерно так.запрос.

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
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 этот запрос должен работать.

...