¿Por qué no puedo usar una función de ventana en una cláusula where en SQL Server?
Una respuesta, aunque no particularmente informativa, es porque la especificación dice que no se puede.
Consulte el artículo de Itzik Ben Gan - Procesamiento lógico de consultas:qué es y qué significa para usted y, en particular, la imagen aquí. Las funciones de ventana se evalúan en el momento de SELECT
en el conjunto de resultados restante después de todos los WHERE
/JOIN
/GROUP BY
/HAVING
se han tratado las cláusulas (paso 5.1).
realmente estoy buscando el razonamiento detrás de no poder usar funciones de ventana en cláusulas where.
La razón por la que no están permitidos en WHERE
cláusula es que crearía ambigüedad. Robar el ejemplo de Itzik Ben Gan de T-SQL de alto rendimiento mediante funciones de ventana (p.25)
Supongamos que su mesa fuera
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
Y tu consulta
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
¿Cuál sería el resultado correcto? ¿Esperaría que col1 > 'B'
¿El predicado se ejecutó antes o después de la numeración de filas?