【问题标题】:Calculate offset of a row计算行的偏移量
【发布时间】:2013-05-20 10:40:09
【问题描述】:

我正在使用 postgresql 在 RoR 上编写服务器端。

今天我遇到了一个功能,我需要识别表格中一行的当前偏移量。客户发给我一个唯一标识符,我需要返回这个项目的当前偏移量。

所以,我有表格“项目”和模型“项目”。

项目有一个唯一的字段。我们称之为“钥匙”。

例如,我的“项目”表有以下数据:

id |  key
----------
0  |  abb

1  |  acc

3  |  cbb

5  |  aqq

如果客户向我发送密钥“aqq”。我应该输出 4。 如果客户给我发“acc”。我应该输出 2。

如果有一种方法可以做到这一点,而无需从表中加载所有数据并循环遍历它?

提前致谢!

【问题讨论】:

  • ... row_number() AS offset OVER (ORDER BY id)怎么样
  • 顺便说一句:如果有两条记录,都带有 key = 'aqq' 会发生什么?你想要第一个、最后一个还是平均偏移量?
  • 虽然这些答案本身并没有错,但这是一个非常糟糕的主意。它将执行糟糕,因为关系数据库确实面向集数据; table 有点用词不当,因为它暗示了一个不存在的排序。只是是没有第n行;你必须做一个明确的SORT,然后在运行中进行某种行编号。看看你是否能找到一些方法来完全避免这样做。

标签: ruby-on-rails ruby-on-rails-3 postgresql


【解决方案1】:

如果你想通过 ActiveRecord 获得它,那么类似:

Item.where("id <= ?", Item.find_by_key("aqq").id).count

【讨论】:

  • 谢谢,看起来很简单整洁
【解决方案2】:

这是您可以在 PostgreSQL 中执行此操作的一种方式,我必须将到 RoR 的映射留给其他人 :)

WITH cte AS ( SELECT id FROM Table1 WHERE key='acc' LIMIT 1 )
SELECT COUNT(Table1.id) 
FROM Table1 JOIN cte ON Table1.id <= cte.id;

An SQLfiddle to test with.

如果您有重复的键,您可能需要按 id 排序 cte SELECT 以确定性地获取具有最高或最低 id 的键。

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 2018-04-13
    • 2021-04-10
    • 2021-10-14
    • 2018-03-31
    • 2011-06-20
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多