2016-07-05 5 views
0

テーブルのn番目に高い値を見つけるために、次のクエリのロジックは何ですか?SQL Serverのテーブルでn番目に高い値を見つける方法

select * 
from tablename as a 
where (n-1) = (select count(distinct(column name) 
       from tablename as b 
       where b.columname > a.columnname) 

例クエリ:クエリはすべての行のために行くとして表にしているどのように多くのユニークな値を数えると言う

SELECT * 
FROM tablename 
ORDER BY expenses DESC 
OFFSET N - 1 ROWS -- Nth highest (N-1 offset) 
FETCH NEXT 1 ROWS ONLY; 
+4

でこの

select TOP 3 * FROM tblperson order by Expenses DESC 

ORこのような何かを試してみてください? –

+0

Microsoft SQL Serverを使用しています – Thulasiram

+0

あなたの質問に適切にタグを付けてください。あなたは "SQL Server"ではなく "構造化クエリ言語"である "SQL"というタグを付けました。 –

答えて

1

あなたは機能OFFSET FETCH Clause (SQL Server Compact)を使用することができます私が見ているものよりも大きな値(特定の列で)。特定の位置に落ちるもの(可能なもの)のみを保持してください。したがって、4位の場合、3つの値が高いと予想されます。

これは、相関サブクエリと呼ばれる内部クエリによって実行されます。サーバーは結果を実際に計算するより効率的な方法を持つ可能性が高いですが、関数呼び出しを伴うループのように考えることができます。内部クエリは外部クエリの各行に対して1回論理的に実行され、内部のaへの参照はこれらの実行ごとに一定です。

このように書き換えて理解するのに役立ちます。 SQL-Serverの(そして、あなたもそれ自体で、内側のクエリをテストすることができます。)

select * from 
(
    select 
     a.columnname, 
     (
      select count(distinct columnname) 
      from tablename as b 
      where b.columnname > a.columnname 
     ) as NumRowsGreater 
    from tablename as a 
) as t 
where NumRowsGreater = (n-1) 
+0

私の電話で私のために私の簡潔さを許すが、これは助けることができる。あなたのステートメントは、リストがランク順に並べられているため、順序付きリストを取得します。単純に 'OFFSET n LIMIT 1'を追加すると、順序付きリストのn番目の要素にある単一のアイテムが返され、結果が得られます。 –

+0

OPがmysqlを使用していた場合に動作する@JakePsimos。しかし、彼らは明らかにSQL Serverを使用していると述べています。 –

+0

@ JakePsimos、あなたのヒントありがとう。私の答えは間違っていました。私のアップデート、MS SQLの 'OFFSET'を見てください。 –

0

select * 
from tblperson a 
where 3 = (select count(distinct(expenses)) 
      from tblperson b 
      where b.Expenses > a.Expenses) 
+0

疑問に思うのは、サブクエリはwhere条件が満たされた回数を返しますが、メインクエリが最大値を返す方法は "where(n-1)="の値だけを比較するためです。 – Thulasiram

+0

@Thulasiram私は本当にあなたの混乱を突き止めることができないので、私はそれをよりよく説明することができます。私の説明を調べるには、相関関係の仕組みが理解できないと思うからです。 – shawnt00

0

あなたのDBMS何ストアドプロシージャ

select TOP @N * FROM tblperson order by Expenses DESC 
+0

N番目の行のみが返されます。 –

関連する問題