0

SQLを使用して以下の情報を抽出しようとしています。テーブルのスキーマは次のとおりです。

person_id、role_id、カウント

例:

p1, r1, 5
p1, r2, 3
p2, r1, 8
p1, r3, 7
p2, r2, 3
p3, r1, 10
p3, r2, 15

people_id ごとに最大数の role_id を抽出するクエリを書きたいと思います。MYSqlまたはoracle DBでどのように行うことができますか

上の表の場合、出力は次のようになります。

p1, r3, 7
p2, r2, 8
p3, r2, 15

上記の出力の説明:

p1 has the maximum count as r3 i.e. 7  
p2 has maximum count as r2 i.e. 8  
p3 has maximum count as r2 i.e.15  

このデータを抽出するための SQL がわかりません。誰かがこれで私を助けることができますか?

4

2 に答える 2

0

1 つの方法は、集計と結合です。

select t.person_id, t.role_id, t.count
from t join
     (select person_id, max(count) as count
      from t
      group by person_id
     ) tsum
     on tsum.person_id = t.person_id and
        tsum.count = t.count;

ただし、最大数が同じ重複がある場合、これには問題があります。

任意のロールが必要な場合、重複がある場合は、次のクエリから結果を集計できます。

select t.person_id, max(t.role_id), t.count
from (select t.person_id, t.role_id, t.count
      from t join
           (select person_id, max(count) as count
            from t
            group by person_id
           ) tsum
           on tsum.person_id = t.person_id and
              tsum.count = t.count
     ) t
group by t.person_id, t.count

別の方法もありますが、これは両方のデータベースで機能します。

于 2013-06-25T11:07:38.737 に答える
0

列名が count と呼ばれることを無視します (SQL のどのフレーバーでも予約語である可能性が低いものを使用することをお勧めします):-

SELECT a.person_id, a.role_id, a.count
FROM table a
INNER JOIN 
(
    SELECT person_id, MAX(count) AS MaxCount
    FROM table
    GROUP BY person_id
) Sub1
ON a.person_id = Sub1.person_id AND a.count = Sub1.MaxCount
于 2013-06-25T11:10:24.250 に答える