sql - 使用带有 where 子句的 ROW_NUMBER() 来获取未过滤表中的行号

标签 sql sqlite

考虑表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 按逻辑顺序运行,而不是按声明命令的顺序运行。因此,FROMJOINWHERE 子句通常是 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/

相关文章:

mysql - 子查询在更新集子句中返回超过 1 个值

MySQL : How to run batch of sql scripts from a folder

android - 多个 Realm 的 Realm 唯一约束

php - 搜索多个表 (SQL)

sql - 为什么我的 As400 无法从新创建的成员别名中进行选择?

python - 将 JSON 响应数据插入 SQLite3 数据库

Android数据库(SQLite)从空表返回非空游标

objective-c - 带有 FMDatabase 包装器的 SQLite 数据库

sql - 如何将这个使用临时表的存储过程的输出转换为物化 View ?

sql - 如何使用 `select` 的结果作为 `insert into` 的参数