【问题标题】:SQL query with additional 'nearest' row具有附加“最近”行的 SQL 查询
【发布时间】:2014-08-21 14:25:07
【问题描述】:

考虑下面的表结构:

id   speed 
 1   100
 2   200
 3   300
 4   400
 5   500

考虑以下查询:"SELECT * FROM records WHERE speed >= 300" - 这将返回第 #3、4、5 行。有没有办法修改此查询,以便使用相同的 300 速度参数它也将返回第一行不符合条件,即#2。所以最终结果将是第 2、3、4、5 行?

UPD:请注意,此处的所有值和记录计数都是任意的,仅作为示例。数据库是 SQLite。

【问题讨论】:

  • 什么版本的 SQL?数据库服务器? MySQL?等等。

标签: sql sqlite select-query


【解决方案1】:

试试这个:

SELECT *
FROM Test
WHERE Speed >= 300

UNION

SELECT * 
FROM (
    SELECT *
    FROM Test
    WHERE Speed < 300
    ORDER BY Speed DESC
    LIMIT 1
) AS XXX

ORDER BY Speed

DEMO

注意:更改为SQLite syntax

【讨论】:

  • 我同意将最近的一行合并的想法,但这是SQL Server 语法,问题标记为SQLite
  • @DrCopyPaste 是的,很抱歉。应该将TOP 替换为LIMIT,但我无法检查,因为sqlfiddle.com 不可用。
【解决方案2】:

试试这个简单的查询,它选择最大 id 和速度 = 300 的行。

SELECT * 
FROM records 
WHERE speed >= 300
OR id = (SELECT MAX(id) FROM records WHERE speed < 300)
ORDER BY id;

【讨论】:

  • 如果 ID 的顺序不是 Speed,即:ID 1 - Speed 200 和 ID 2 - Speed 100,这有点错误。
【解决方案3】:
select * 
from records
order by abs(300 - speed) asc
limit 5

【讨论】:

  • 如果你不知道有多少行怎么办?这意味着“5”不是常数,而是变量?
  • IIRC TOP 不能与 SQLITE 一起使用,它应该是 LIMIT 5 最后,不是吗?
  • @DrCopyPaste:当然。我当时以为是 SQLServer。
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多