Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top