3

次のようなテーブルがあるとします。

Player  Score
A       5
B       4
A       3
B       2
A       1
B       1
A       2
B       3
A       4
B       5

プレーヤーごとに「グループ化」された降順で、プレーヤーごとに 3 つの最高スコアを返す SQL クエリが必要です。

Player  Score
A       5
A       4
A       3
B       5
B       4
B       3

ポインタに非常に感謝します。

4

4 に答える 4

3

これは、グループごとに上位 n を生成する昔ながらの (基本的な sql を読む) 方法です。グループ条件 (ここではプレーヤー) でテーブルに参加し、右側のスコアが高いレコードを選ぶことができます。そのようなレコードが 3 つ以下の場合、行はグループごとの上位 n 行の 1 つです。

select player.player, player.score
from Player
left join Player p2
on p2.player = player.player
  and p2.score > player.score
group by player.player, player.score
having count(distinct p2.score) < 3
order by 1, 2 desc

not exists を使用して確認できる代替バージョン:

select player, score
from player
where not exists
(
  select p2.player
  from Player p2
  where p2.player = player.player
  and p2.score > player.score
  group by p2.player
  having count(distinct p2.score) > 3
)
order by 1, 2 desc

この 2 つのバージョンは同順位の表示が異なります。最初のバージョンは (group by の性質により) 1 行を返し、元のテーブルに結合してすべてのレコードを表示する必要がありますが、2 つ目のバージョンは元のテーブルから直接動作し、すべてのデータと同順位を一度に表示します。 .

Demo は Sql Fiddle にあります。

于 2012-04-23T22:24:07.823 に答える
3

SQL サーバーで:

select p.player, p.score
from PS p
where p.score in (select top 3 score from PS 
                 where player = p.player order by score desc)
order by p.player asc, p.score desc

MySqlで:

select p.player, p.score
    from PS p
    where p.score in (select score from PS 
                     where player = p.player order by score desc limit 3)
    order by p.player asc, p.score desc
于 2012-04-23T23:18:12.610 に答える
2

あなたが探しているものはここで見つかると思います:

http://www.sql-ex.ru/help/select16.php

基本的に、最良のソリューションは RANK 関数を使用します。サイトのサンプルコードは次のとおりです。

SELECT maker, model, type FROM
(
SELECT maker, model, type, RANK() OVER(PARTITION BY type ORDER BY model) num
FROM Product
) X
WHERE num <= 3

Partition By セクションを変更して、スコアの降順で並べ替えるだけです。

編集

MySQL を使用するという情報に基づいて、上記のクエリにいくつかの変更を加える必要があります (これは Microsoft SQL で動作します)。RANK 関数を独自の RANK 実装に置き換える必要があります。それほど難しくありません。完全な手順は次の場所にあります。

http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/

これにより、ランク番号を取得できるカウンターを実装する方法が示されます。

于 2012-04-23T20:11:03.897 に答える
1

使用する DBMS によっては、何らかの形式で row_number を使用できる場合があります。

SQL Server 2008 では、使用できます

create table #player
( Player char, Score int )

insert into #player (Player, Score) Values
('A',5),('B',4),('A',3),('B',2),('A',1),('B',1),('A',2),('B',3),('A',4),('B',5)

select * from #player

select Player, Score from 
(
  select *, ROW_NUMBER() over(partition by Player order by Score desc) as rowNo 
  from #player
) as tmp
where tmp.rowNo <= 3

drop table #player
于 2012-04-23T20:09:56.687 に答える