0

hiscore リストを作成したいのですが、なかなかできません。これは私の hiscore テーブルで、すべてのゲームでユーザー スコアをこのテーブルに書き込みます。

これは私の hiscore テーブルがどのように見えるかです:

id    user_id    user_name    score    entry_date
-----------------------------------------------------------
1      1         tom          500      2012-06-05 14:30:00
2      1         tom          500      2012-06-05 10:25:00
3      2         jim          300      2012-06-05 09:20:00
4      2         jim          500      2012-06-05 09:22:00
5      3         tony         650      2012-06-05 15:45:00

最初の 3 つの MAX スコアを取得したいのですが、それらが同じスコアであるかどうかを確認する必要がある場合は、最初に入力されたスコアを取得する必要があります (entry_date列に基づいて)

返されるクエリは次のようになります。

1.  3      tony     650      2012-06-05 15:45:00     <- hi have to be first, because he have top score
2.  2      jim      500      2012-06-05 09:22:00     <- jim have the same score as tom, but he make that score before tom did so he is in second place
3.  1      tom      500      2012-06-05 10:25:00     <- tom have 2 entries with the same score, but we only take the one with smallest date

これは私が書いた SQL クエリですが、そのクエリで hiscore リストを取得していますが、entry_date で並べ替えられておらず、この問題を解決する方法がわかりません。

SELECT TOP 3
    hiscore.user_id,
    hiscore.user_name,
    MAX(hiscore.score) AS max_score,
FROM
    hiscore
GROUP BY
    hiscore.user_id, hiscore.user_name
ORDER BY
    max_score DESC

更新: スコア合計の質問について

スコアの合計については、元の hiscore テーブルをクエリするときにこれを返すクエリが必要です。

user_id   user_name    score
--------------------------------
1          Tom        1000
2          Jim         800
3          Tony        650

また、スコアの合計が同じユーザーが 2 人いる場合、hiscore テーブルのエントリが少ないユーザーの方がランクが高くなります。

4

2 に答える 2

1

これを試して :

;with cte as 
(Select id ,userID,score,entry_date,row_number() over(partition by userID
 order by score desc,entry_date) as row_num from Score
)
Select * from cte where row_num=1 ORDER BY Score DESC,entry_date 

// sum of score  for individual user 
Select  UserID,sum(Score) from Score
group by UserID

SqlFiddleの結果

于 2012-07-10T15:31:02.113 に答える
0

編集:この最初のクエリは嘘であり、機能しません! :)、SQL 2005+が2番目のものを使用すると仮定します

EntryDate を注文に追加するだけです。

SELECT TOP 3 
    hiscore.user_id, 
    hiscore.user_name, 
    MAX(hiscore.score) AS max_score, 
FROM 
    hiscore 
GROUP BY 
    hiscore.user_id, hiscore.user_name 
ORDER BY 
    max_score DESC, entry_date DESC

編集: ああ、グループ by も表示されませんでした。忘​​れてください。ちょっと待ってください。

これ:P

SELECT * FROM (SELECT
    hiscore.user_id,
    hiscore.user_name,
    hiscore.score,
    hiscore.entry_date,
    ROW_NUMBER() OVER (PARTITION BY User_id ORDER BY Score DESC, entry_date) as scoreNo
FROM 
    hiscore 
) as highs WHERE ScoreNo = 1 ORDER BY Score DESC, entry_date

SQL 2005 以降を想定

編集:

スコア順、次にエントリ数順で最高のスコアを取得するには、クエリを少し単純にします。

SELECT user_id, user_name, SUM(score) as Score from hiscore
GROUP BY user_id, user_name
ORDER BY sum(score) DESC, count(score) 

これにより、「スコア」の合計が降順で並べられ、次にエントリ数が昇順で並べ替えられたスコアが得られます。これにより、必要なものが得られます

于 2012-07-10T15:09:56.143 に答える