2011-06-13 87 views
2

我一直在尝试几个小时,但无法通过查询,我想使用DB2来执行以下操作。从表公司和用户我有每个公司下面的票量信息/用户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 TOM)

所以应该给我这将是与300标记的同样将是toytfrd最高的用户, kryr。我需要查询中的所有人。
我不知道这是可能的查询或我需要创建一个存储过程。

回答

6

你可以用analytic queries来做到这一点。不过要小心。该模式通常用于涉及嵌套子查询。 (一个产生数据集,下一个将其添加到模式,第三个选择你想要的行。)

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

原始查询。

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标准,该查询应该可以工作。

+0

你给了我正确的答案,是的它也适用于DB2!我一直在试图做到这一点,但无法弄清楚。谢谢bubby! – 2011-06-13 22:51:43

+0

在iSeries上的DB/2上进行测试,确实可行! – Bjinse 2013-05-23 12:57:36

+0

另外,考虑使用Dense_Rank()而不是Rank()来管理两家公司之间的联系。非常好的工作将其分解成逐步的说明@btilly – codemonkey 2014-07-18 16:24:47