2012-02-06 6 views
3

私はSEDEのクエリに取り組んでいます:`order by`コンポーネントを持つウィンドウ関数を使用するときの結果セットの順序は?

select top 20 
    row_number() over(order by "percentage approved" desc, approved desc), 
    row_number() over(order by "total edits" asc), 
    * 
from editors 
where "total edits" > 30 

2つの窓関数を考慮に入れて、結果セットの順序とは何ですか?

私はそれが未定義だと思われますが、決定的な答えを見つけることができませんでした。 OTOHでは、このようなウィンドウ関数を1つ持つクエリの結果は、over(order by ...)節に従って並べ替えられました。

+2

これらのORDER BYは、ウィンドウ関数の "内部"であり、**単にウィンドウ関数の値を決定するために**使用されます - **外部効果SELECT ** - * NOT **何らかの形、形、形式でSELECT全体に 'ORDER BY 'を指定しないでください –

+1

順序は保証されていません。しかし、**特定の順序が必要な場合は、SELECT文の列を並べ替える順序が効率に影響します(http://sqlblogcasts.com/blogs/sqlandthelike/archive/2011/)。 06/06/column-order-can-matter.aspx) –

+0

@marc_s "効果がありません"ということは真実ではありません。 –

答えて

5

結果はオーダーに返すことができます。

ここでは、多くの場合、OVER句に指定されている順序と同じ順序で返されますが、SQL Serverは集計を計算するために行を並べ替えるクエリプランを選択する可能性が高いからです。これは、いつでも異なるクエリプランを選択できるため、特に、クエリをより複雑にして、可能なクエリプランのスペースを広げるようになるため、保証されるものではありません。

5

結果セットANY明示的なORDER BYを持たないSQL Serverクエリは定義されていません。

これは、クエリ内にウィンドウ関数がある場合、またはサブクエリのORDER BYが含まれている場合に表示されます。結果の順序は多くの要素に依存しますが、ORDER BYを指定しない限り保証されません。

関連する問題