考虑表t
:
x y
1 2
3 4
以及有点幼稚的查询
SELECT
ROW_NUMBER() OVER ( ORDER BY x ) row_num,
x,
y
FROM
t
WHERE
x = 3;
哪个(可以理解)输出
row_num x y
1 3 4
但是,我想要
row_num x y
2 3 4
(row_num
应该在未过滤的表上“计算”,因此在应用 WHERE
子句之前)
我试过了
SELECT
ROW_NUMBER() OVER ( ORDER BY t.x ) row_num,
t1.x,
t1.y
FROM
t, t as t1
WHERE
t.x = t1.x AND t1.x = 3;
但我得到了完全相同的输出。
ROW_NUMBER
是否总是最后执行,还是有办法强制它先执行,然后应用 WHERE
子句?
最佳答案
窗口函数是分析型、临时类型的计算,在检索数据的当前范围内运行。与大多数编程语言的词法顺序不同,SQL 按逻辑顺序运行,而不是按声明命令的顺序运行。因此,FROM
、JOIN
、WHERE
子句通常是 SQL 查询中运行的第一个步骤。因此,一旦检索到数据,就会在该数据范围上计算窗口函数。
事实上 SQLite 的 window function docs暗示这一点(强调):
A window function is an SQL function where the input values are taken from a "window" of one or more rows in the results set of a SELECT statement.
您可以使用 CTE 或子查询来解决您的需求,而不是您到达的自连接解决方案(使用过时的 implicit and not explicit join ):
WITH sub AS (
SELECT
ROW_NUMBER() OVER ( ORDER BY x ) AS row_num
, x
, y
FROM
t
)
SELECT
sub.row_num
, sub.x
, sub.y
FROM
sub
WHERE
sub.x = 3;
SELECT sub.row_num
, sub.x
, sub.y
FROM (
SELECT
ROW_NUMBER() OVER ( ORDER BY x ) AS row_num
, x
, y
FROM
t
) sub
WHERE
sub.x = 3;
关于sql - 使用带有 where 子句的 ROW_NUMBER() 来获取未过滤表中的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64445905/