【问题标题】:dense_rank and sqlite - possible?dense_rank 和 sqlite - 可能吗?
【发布时间】:2018-12-18 01:40:59
【问题描述】:

我的情况是我有一个很小的PostgresSQL 数据库(大约 10 个表,其中最大的是几千行),我想从单用户样式的应用程序中使用它,所以必须安装整个服务器感觉不必要地繁重。所以,我想,好吧,SQLite 听起来只是门票。

我移植了架构,导入了数据,然后我卡在了一个视图上(实际上,它只有一个视图)。我的问题是我正在使用非常方便的dense_rank 函数。我读到这个:sqlite - Unsupported Sql Analytical Functions 并且可以看到它不可用,但它告诉我它可能在 SQLite::More 但它似乎也不在那里。

那么,有谁知道我可以通过什么方式让dense_rank 函数在 SQLite 数据库的视图中可用?有没有我可以使用的其他库?

【问题讨论】:

  • 运行 Postgres 有什么问题?你有非常严格的内存限制吗?安装有问题吗?
  • 是的,主要是安装 - 需要数据库服务器来处理单用户应用程序似乎有点过头了。
  • 代码不能模拟dense_rank:对于几千行,它甚至不会被注意到。我什至认为,通过切换到 sqlite 来提高整体速度将掩盖排名计算过程的额外负担。
  • 安装就像解压缩档案一样简单。并且空闲的 Postgres 服务器的资源需求非常低。
  • @a_horse 但是 SQLite 的资源和管理需求甚至更低。对于简单的工作。 (有一点需要使用服务器数据库。)

标签: sqlite


【解决方案1】:

您可以使用子查询模拟DENSE_RANK 函数:

例子:

SELECT Products.Product,
DENSE_RANK() OVER (ORDER BY Products.Code DESC) AS Rank
FROM Products;

在 SQLite 中:

SELECT Product,
(SELECT COUNT()+1 FROM (
    SELECT DISTINCT Code FROM Products AS t WHERE Code < Products.Code)
) AS Rank
FROM Products;

【讨论】:

  • 太好了,非常感谢,这会很好地解决问题 - 我可以忍受较慢的性能,因为我的表中的行太少了。
  • 谢谢,非常有帮助。我注意到 NULL 条目得到 Rank=1 就像数据中出现的最低值一样,如果这可能是您的数据中的问题,请注意。
【解决方案2】:

2018 年更新:如果您查看 sqlite 版本历史记录,则从 3.25 版开始支持dense_rank(以及其他窗口函数)。

https://www.sqlite.org/changes.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2012-02-26
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多