質問
私は何時間も試してきましたが、クエリをGEできません。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
ご覧のとおり、企業には多くのユーザーがいて、それぞれが会社ごとに異なる数量を持っているため、結果はユーザーが会社あたりの数量が最も多いことになるはずです。 IE:会社 nissn
2人のユーザーがいて、それぞれに(300のマーク)と(145のTom)があります
だから、それは私に300のマークとなる最高のユーザーを与えるべきです。 toyt
, frd
, kryr
. 。それらすべてがクエリに必要です。
それがクエリで可能かどうか、またはストアドプロシージャを作成する必要があるのだろうか。
解決
これを行うことができます 分析クエリ. 。しかし、注意してください。パターンは通常、ネストされたサブ征服を含むように機能します。 (1つはデータセットを作成し、次はパターンに追加するために、3番目は必要な行を選択します。)
この場合、このように見えるはずです。
元のクエリ。
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を使用していませんが、標準は厳密にそれらをドロップすることを妨げません。そして、それらを必要とする少なくとも1つのデータベースを知っています。)
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規格によれば、そのクエリは機能するはずです。
所属していません StackOverflow