por que não posso usar uma função em janela em uma cláusula where no SQL Server?
Uma resposta, embora não seja particularmente informativa, é porque a especificação diz que você não pode.
Veja o artigo de Itzik Ben Gan - Processamento de consultas lógicas:o que é e o que significa para você e, em particular, a imagem aqui. As funções da janela são avaliadas no momento do
SELECT
no conjunto de resultados restante após todos os WHERE
/JOIN
/GROUP BY
/HAVING
cláusulas foram tratadas (passo 5.1).
realmente estou procurando o raciocínio por trás de não poder usar funções de janela em cláusulas where.
O motivo pelo qual eles não são permitidos no
WHERE
cláusula é que isso criaria ambiguidade. Roubando o exemplo de Itzik Ben Gan do T-SQL de alto desempenho usando funções de janela (p.25) Suponha que sua mesa fosse
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
E sua consulta
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
Qual seria o resultado certo? Você esperaria que o
col1 > 'B'
predicado foi executado antes ou depois da numeração das linhas?