如何在 sqlite 中使用 ROW_NUMBER

Posted

技术标签:

【中文标题】如何在 sqlite 中使用 ROW_NUMBER【英文标题】:How to use ROW_NUMBER in sqlite 【发布时间】:2013-05-26 16:50:35 【问题描述】:

下面是我的查询。

select * from data where value = "yes";

我的 id 是自动递增的,下面是给定查询的结果。

id || value 
1  ||   yes
3  ||   yes
4  ||   yes
6  ||   yes
9  ||   yes

?这样我就可以得到下面给出的结果。

NoId || value 
1    ||   yes
2    ||   yes
3    ||   yes
4    ||   yes
5    ||   yes

ROW_NUMBER 作为编号。

【问题讨论】:

***.com/questions/9151706/… id 是自增还是 PK 列?你试过SELECT _ROWID_吗? @Scotch:它并不完全重复,因为 OP 似乎在询问全表扫描的 ROWID,而不是特定查询的 ROWID。 @AlixAxel 那么查询整个表? @Scotch:数据似乎表明,是的。我知道也可以通过您链接到的答案来克服这个问题,但这可能是不必要的且速度较慢(取决于id 的列定义)。 【参考方案1】:

试试这个查询

select id, value, (select count(*) from tbl b  where a.id >= b.id) as cnt
from tbl a

FIDDLE

| id | value | cnt |
--------------------
|  1 |   yes |   1 |
|  3 |   yes |   2 |
|  4 |   yes |   3 |
|  6 |   yes |   4 |
|  9 |   yes |   5 |

【讨论】:

检查小提琴。它仅使用 sqllite .. 你能发布你正在使用的查询吗.. ***.com/questions/19445155/…【参考方案2】:

SQLite Release 3.25.0 将增加对窗口函数的支持

2018-09-15 (3.25.0)

    添加对窗口函数的支持

Window Functions :

窗口函数是一种特殊的 SQL 函数,其中输入值取自 SELECT 语句结果集中的一个或多个行的“窗口”。

SQLite 支持以下 11 个内置窗口函数:

row_number()

当前分区内的行号。行从 1 开始按窗口定义中的 ORDER BY 子句定义的顺序编号,否则按任意顺序编号。

所以你的查询可以重写为:

select *, ROW_NUMBER() OVER(ORDER BY Id) AS NoId
from data 
where value = "yes";

db-fiddle.com demo

【讨论】:

太棒了。它也适用于聚合函数。 +1 感谢您提供这些重要信息。在过去的一天里,我一直在拼命想弄清楚为什么在尝试使用 java JDBC 驱动程序使用 row_number 函数时出现语法错误。在我看到您的评论并意识到我正在运行版本 3.20.1 之前,找不到任何关于它的信息。升级版本后,我现在可以使用窗口功能了!!再次感谢。 ROW_NUMBER() 添加到 sqlite3 以来的最佳解决方案。【参考方案3】:

我对 fiddleanswer 进行了一些修改,并得到了预期的结果

select id, value , 
       (select count(*) from data b where a.id >= b.id and b.value='yes') as cnt 
from data a where  a.value='yes';

result
1|yes|1
3|yes|2
4|yes|3
6|yes|4
9|yes|5

【讨论】:

这只是意味着,SQLite 中没有这样的功能。我想知道这是否是 O(n^2) 顺便说一句... 是的,这是 n^2-ish。不要这样做:)【参考方案4】:

更新:sqlite3 3.25 版现在支持窗口函数,包括:

row_number() over(按id排序)

SQLITE3 Documentation

【讨论】:

以上是关于如何在 sqlite 中使用 ROW_NUMBER的主要内容,如果未能解决你的问题,请参考以下文章

如果不使用 sqlite 中的 row_number() 函数,如何提供相同的函数?

sqlite3模块中的ROW_NUMBER函数

sqlite3 模块中的 ROW_NUMBER 函数

Sqlite 中的 ROWNumber

如何在此查询中使用 ROW_NUMBER? [关闭]

如何在 Hibernate 中使用 row_number 函数编写查询?