db2查询top group by

问题描述 投票:0回答:2

我已经尝试了几个小时,但无法获取查询,我想使用 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
也是如此。我在查询中需要所有这些。
我想知道这在查询中是否可能,或者我需要创建一个存储过程。

sql group-by db2 highest
2个回答
7
投票

您可以使用分析查询来做到这一点。 但要小心。 该模式通常涉及嵌套子查询。 (第一个用于生成数据集,第二个用于将其添加到模式中,第三个用于选择所需的行。)

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

原始查询。

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
投票

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 COUNT(T.USER) DESC

© www.soinside.com 2019 - 2024. All rights reserved.