古いスレッドですが、トピックで表現されている質問に具体的に答えようと思います。
where句にウィンドウ関数がないのはなぜですか?
SELECT
ステートメントには、キー入力された順序で指定された次の主要な句があります。
SELECT DISTINCT TOP list
FROM JOIN ON / APPLY / PIVOT / UNPIVOT
WHERE
GROUP BY WITH CUBE / WITH ROLLUP
HAVING
ORDER BY
OFFSET-FETCH
論理クエリ処理順序、またはバインディング順序は、概念的な解釈順序であり、クエリの正確さを定義します。この順序により、1つのステップで定義されたオブジェクトが、後続のステップの句でいつ使用可能になるかが決まります。
----- Relational result
1. FROM
1.1. ON JOIN / APPLY / PIVOT / UNPIVOT
2. WHERE
3. GROUP BY
3.1. WITH CUBE / WITH ROLLUP
4. HAVING
---- After the HAVING step the Underlying Query Result is ready
5. SELECT
5.1. SELECT list
5.2. DISTINCT
----- Relational result
----- Non-relational result (a cursor)
6. ORDER BY
7. TOP / OFFSET-FETCH
----- Non-relational result (a cursor)
たとえば、クエリプロセッサがFROM
句で定義されたテーブルまたはビューにバインド(アクセス)できる場合、これらのオブジェクトとその列は後続のすべてのステップで使用できるようになります。
逆に、句の前にあるすべての句は、SELECT
句で定義された列エイリアスまたは派生列を参照できませんSELECT
。ただし、これらの列は、句などの後続の句から参照できますORDER BY
。
OVER
句は、関連するウィンドウ関数が適用される前に、行セットの分割と順序を決定します。つまり、この句は、基になるクエリ結果OVER
セット内のウィンドウまたはユーザー指定の行セットを定義し、window関数はそのウィンドウに対して結果を計算します。
Msg 4108, Level 15, State 1, …
Windowed functions can only appear in the SELECT or ORDER BY clauses.
背後にある理由は、論理クエリ処理がでどのように機能するかによるものですT-SQL
。基礎となるクエリ結果は、論理クエリ処理がSELECT
ステップ5.1に達したときにのみ確立されるためです。(つまり、、、、およびステップを処理した後FROM
)、WHERE
ウィンドウ関数はクエリのand句でのみ許可されます。GROUP BY
HAVING
SELECT
ORDER BY
言及することに注意してください、リレーショナルモデルが順序付けられたデータを処理しない場合でも、ウィンドウ関数は依然としてリレーショナルレイヤーの一部です。SELECT
ステップ5.1の後の結果。どのウィンドウ関数でもまだリレーショナルです。
また、厳密に言えば、ウィンドウ関数がWHERE
句で許可されない理由は、あいまいさを生み出すためではなく、論理クエリ処理がSELECT
でステートメントを処理する順序のためT-SQL
です。
リンク:ここ、ここ、ここ