postgres 有 CLOSEST 运算符吗?
我正在寻找这样的东西,给定一个这样的表:
| id | number |
| 1 | .7 |
| 2 | 1.25 |
| 3 | 1.01 |
| 4 | 3.0 |
查询 SELECT * FROM my_table WHERE
numberCLOSEST(1)
将返回第 3 行。我只关心数字。现在我有一个程序,它只循环每一行并进行比较,但我认为信息应该可以从 b 树索引中获得,所以这可能作为内置程序,但我找不到任何文档表明确实如此。
I'm looking for something that, given a table like:
| id | number |
| 1 | .7 |
| 2 | 1.25 |
| 3 | 1.01 |
| 4 | 3.0 |
the query SELECT * FROM my_table WHERE
numberCLOSEST(1)
would return row 3. I only care about numbers. Right now I've got a procedure that just loops over every row and does a comparison, but I figure the information should be available from a b-tree index, so this might be possible as a builtin, but I can't find any documentation suggesting that it does.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我可能在语法上有点偏离,但是这个参数化查询(所有 ? 都取原始问题的“1”)应该运行得很快,基本上是 2 个 B 树查找 [假设数字已索引]。
具有约 5e5 行的表(索引位于
number
)的查询计划如下所示:I may be a little off on the syntax, but this parameterized query (all the ? take the '1' of the original question) should run fast, basically 2 B-Tree lookups [assuming number is indexed].
The query plan for this with a table of ~5e5 rows (with an index on
number
) looks like this:您可以尝试这样的操作:
这与手动循环表没有太大不同,但至少它可以让数据库在“数据库空间”内进行循环,而不必在函数和数据库内部之间来回跳转。此外,将所有内容推送到单个查询中可以让查询引擎知道您要做什么,然后它可以尝试以合理的方式执行此操作。
You could try something like this:
This isn't that much different than manually looping through the table but at least it lets the database do the looping inside "database space" rather than having to jump back and forth between your function and the database internals. Also, pushing it all into a single query lets the query engine know what you're trying to do and then it can try to do it in a sensible way.
第二个答案是正确的,但我在“UNION ALL”上遇到错误:
DBD::Pg::st执行失败:错误:“UNION”处或附近的语法错误
我用这段代码修复了它:
技巧是从内表中删除 AS 并仅在 UNION 上使用它。
The 2nd answer is correct, but I encountered error on "UNION ALL":
DBD::Pg::st execute failed: ERROR: syntax error at or near "UNION"
I fixed it with this code:
the trick is to remove the AS from the inner tables and use it only on the UNION.
如果您希望找到组内最接近的值,此代码会很有帮助。在这里,我根据列
val
与目标值 0.5column_you_wish_to_group_by 拆分表tb
>。This code is helpful if you wish to find the closest value within groups. Here,I split my table
tb
bycolumn_you_wish_to_group_by
based on how close my columnval
is close to my target value 0.5.