首页 > 解决方案 > 如何将“索引”列添加到 SQLite 视图?

问题描述

我有一个顺序很重要的视图,我想要一个“索引”列(计数 1、2、3 等),所以我可以选择该列并获取匹配行所在的位置。有没有办法做到这一点?

对于一个真正快速制作的简化示例,我创建了一个类似的视图:

CREATE VIEW my_view AS
    SELECT (var1 * 2 - var2 * 3) AS result FROM
      (SELECT var1 FROM table1) AS var1,
      (SELECT var2 FROM table2) AS var2
    ORDER by result DESC

这将返回一个值列表。

喜欢:

CREATE VIEW my_view AS
    SELECT (var1 * 2 - var2 * 3) AS result, place FROM
      (SELECT var1 FROM table1) AS var1,
      (SELECT var2 FROM table2) AS var2
    ORDER by result DESC

但我不知道如何定义“地方”。Place 是结果出现的地方。因此,第 47 行中的任何内容都有“47”作为“place”中的值。

我的最终目标是能够获得place结果值与另一行并列的所有 s 的列表。

标签: sqlsqlite

解决方案


如果您使用的是现代版本的 sqlite(3.25 或更高版本),row_number()则可以轻松完成:

CREATE VIEW my_view(result, place) AS
 SELECT result, row_number() OVER (ORDER BY result DESC)
 FROM (SELECT (table1.var1 * 2 - table2.var2 * 3) AS result
       FROM table1
       JOIN table2)
 ORDER BY result DESC;

(注意使用 ANSI 连接语法,而不是最好避免的那种古老的逗号)。

db<>小提琴示例


我确实认为作为一般规则ORDER BY应该被排除在外;从视图中选择的任何内容都应该负责对数据进行排序以进行演示,而不是它 - 如果您有时想要不同的顺序怎么办?不过,在这种情况下,好消息是排序本质上是免费的,因为无论如何都需要完成它来计算行号。


推荐阅读