7

私が実際に抱えていた問題を解決するためのさまざまな方法を見つけたいと思います。ユーザーがポイントを集めるコンテストやゲームを想像してみてください。最高の "n" スコアを持つユーザーのリストを表示するには、クエリを作成する必要があります。

私は明確にするために例を作っています。これがユーザー テーブルであり、獲得したポイントがあるとします。

UserId - Points
1      - 100
2      -  75
3      -  50
4      -  50
5      -  50
6      -  25

上位 3 つのスコアが必要な場合、結果は次のようになります。

UserId - Points
1      - 100
2      -  75
3      -  50
4      -  50
5      -  50

これは、必要に応じて、ビューまたはストアド プロシージャで実現できます。私のターゲットデータベースはSql Serverです。実際にはこれを解決しましたが、結果を得るには別の方法があると思います...私よりも速くまたは効率的です。

4

11 に答える 11

11

テストされていませんが、動作するはずです:

select * from users where points in
(select distinct top 3 points from users order by points desc)
于 2008-09-01T11:07:41.993 に答える
4

これが機能するものです-より効率的かどうかはわかりません.SQL Server 2005+です

with scores as (
    select 1 userid, 100 points
    union select 2, 75
    union select 3, 50
    union select 4, 50
    union select 5, 50
    union select 6, 25
),
results as (
    select userid, points, RANK() over (order by points desc) as ranking 
    from scores
)
select userid, points, ranking
from results
where ranking <= 3

明らかに、最初の "with" は値を設定するためのものなので、2 番目をテストし、最後の選択作業を行うことができます。既存のテーブルに対してクエリを実行している場合は、"with results as..." から始めることができます。

于 2008-09-01T11:59:05.537 に答える
1

実際には、INNER JOIN を使用して WHERE IN を変更すると、はるかに高速になります。

SELECT 
   userid, points 
FROM users u
INNER JOIN 
(
   SELECT DISTINCT TOP N 
      points 
   FROM users 
   ORDER BY points DESC
) AS p ON p.points = u.points
于 2008-09-18T01:57:27.880 に答える
1

どうですか:

select top 3 with ties points 
from scores
order by points desc

「ネクタイ付き」がSQL Server以外で機能するかどうかはわかりません。

SQL Server 2005 以降では、「トップ」番号を int パラメータとして渡すことができます。

select top (@n) with ties points 
from scores
order by points desc
于 2008-09-01T11:32:25.913 に答える
0

これを試して

select top N points from users order by points desc
于 2008-09-19T10:03:48.797 に答える
0

@bosnic、私はそれが要求どおりに機能するとは思わない.私はMS SQLに精通していない.

このようなものが動作するはずです:

select userid, points 
   from scores 
   where points in (select top 3 points 
                       from scores 
                       order by points desc) 
   order by points desc
于 2008-09-01T11:12:00.377 に答える
0

@Espo リアリティ チェックに感謝 - それを修正するためにサブセレクトを追加しました。

私は、次のように答えるのが最も簡単だと思います。

select userid, points from users
where points in (select distinct top N points from users order by points desc) 

N をパラメーターとして受け取るストアド プロシージャにそれを配置する場合は、SQL を変数に読み取ってから実行するか、行カウントのトリックを実行する必要があります。

declare @SQL nvarchar(2000)
set @SQL = "select userID, points from users "
set @SQL = @SQL + " where points in (select distinct top " + @N
set @SQL = @SQL + " points from users order by points desc)"

execute @SQL

また

SELECT  UserID, Points
FROM     (SELECT  ROW_NUMBER() OVER (ORDER BY points DESC)
         AS Row, UserID, Points FROM Users)
        AS usersWithPoints
WHERE  Row between 0 and @N

どちらの例も SQL Server を想定しており、テストされていません。

于 2008-09-01T11:15:53.630 に答える
0

@ロブ#37760:

select top N points from users order by points desc

N が 3 の場合、このクエリは 3 行のみを選択します。質問を参照してください。"Top 3" は 5 行を返す必要があります。

于 2008-09-01T11:21:20.073 に答える
0

@マット・ハミルトン

あなたの答えは上記の例で機能しますが、データセットが 100、75、75、50、50 の場合は機能しません (3 行しか返されません)。TOP WITH TIES には、返された最後の行のタイのみが含まれます...

于 2008-09-01T13:02:31.673 に答える
0

Crucible はそれを実現しました (SQL 2005 がオプションであると仮定します)。

于 2008-09-01T13:08:10.783 に答える