考虑表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函数文档暗示了这一点(添加了重点):
窗口函数是一种SQL函数,其中输入值是从SELECT语句的结果集中的一个或多个行的“窗口”中获取的。
可以使用CTE或子查询解决您的需求,而不是使用自动联接解决方案(该解决方案使用过时的隐式和非显式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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句