db2查询顶级组

Jua*_*lla 2 sql db2 group-by highest

我已经尝试了几个小时但无法查询,我想使用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 
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

这应该是结果(每个公司的最佳用户)

user         company      quantity
----------------------------------
mark         nissn        300    
jose         toyt         230    
steve        frd          100    
steve        kryr         80
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,公司中有许多用户,每个公司的每个公司都有不同的数量,结果应该是每个公司的用户数量最多.即:公司nissn它有2个用户,每个都有(标记为300)和(tom为145)

所以应该给我这将是马克与300最高的用户同样将是toyt,frd,kryr.我在查询中需要所有这些.
我想知道在查询中是否可行,或者我需要创建存储过程.

bti*_*lly 6

您可以使用分析查询执行此操作.不过要小心.该模式通常涉及嵌套子查询.(一个用于生成数据集,下一个用于将其添加到模式中,第三个用于选择所需的行.)

在这种情况下,它应该看起来像这样.

原始查询.

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)
Run Code Online (Sandbox Code Playgroud)

分析查询.(注意,s是命名子查询.我没有使用过DB2,但标准严格禁止删除它们,而且我知道至少有一个需要它们的数据库.)

SELECT user, quantity, company
  , RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s
Run Code Online (Sandbox Code Playgroud)

最后结果.

SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1
Run Code Online (Sandbox Code Playgroud)

合并后的查询是:

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
Run Code Online (Sandbox Code Playgroud)

正如我所说,我没有使用过DB2.但根据SQL标准,该查询应该有效.