2016-04-13 6 views
1

私は次のSQLテーブル設定を使って、異なるプレイヤーの得点を追跡しています。スコア表から "高得点"表を取得

create table scoreTable (
    userName varchar2(100), 
    score number 
) 
/
insert into scoreTable values ('Andy', 200); 
insert into scoreTable values ('Andy', 33); 
insert into scoreTable values ('Bob', 444); 
insert into scoreTable values ('Charlie', 213); 
insert into scoreTable values ('Charlie', 4); 
insert into scoreTable values ('Charlie', 777); 

ここで、selectステートメントを使用して各プレーヤーの最高得点を返したいとします。私はちょうど明確な名前値の任意の数の最上位の結果を与える1つのselect文を持っていることを好むだろう結果が

NAME  SCORE 
_____  ____ 
Andy  200 
Bob  444 
Charlie 777 

ようにしたいと思います。そんなことは可能ですか?

答えて

1

このようなことは可能ですか?

はい。

単純集計:

SELECT userName, MAX(score) AS score 
FROM scoreTable 
GROUP BY userName 
ORDER BY userName; 

LiveDemo

EDIT:

リターン行全体RANK関数を使用して

WITH cte AS 
(
    SELECT *, RANK() OVER(PARTITION BY userName ORDER BY score DESC) AS rn 
    FROM scoreTable 
) 
SELECT * 
FROM cte 
WHERE rn = 1 
ORDER BY userName; 

またはSELF JOINを使用して:

SELECT s1.* 
FROM scoreTable s1 
LEFT JOIN scoreTable s2 
    ON s1.userName = s2.userName 
AND s1.score < s2.score 
WHERE s2.userName IS NULL 
ORDER BY userName; 

LiveDemo

+0

答えてくれてありがとう、私は、私は少し多すぎる問題を単純化している可能性が推測。行全体を返す方法はありますか?たとえば、私は日付の列を持っているので、プレイヤーはそのスコアを取得したときにそれを見ることができます。 – Coat