【问题标题】:SQLite: Select minimum value in a range from n to n-ySQLite:选择从 n 到 n-y 范围内的最小值
【发布时间】:2021-09-06 05:38:10
【问题描述】:

我有一个由 id 和客户标识的订单列表。我需要知道从该客户放置的索引 n 的顺序开始的索引 n-9 的订单的 id。

例如:

SELECT OrderID 
FROM Orders 
WHERE CustomerID = "1808317576" AND OrderID < 29 
ORDER BY OrderID DESC LIMIT 9

上面的查询返回这些记录:

OrderID
28
26
23
20
19
18
17
16
13

为了解决我的问题,我尝试这样做:

SELECT OrderID 
FROM Orders 
WHERE CustomerID = "1808317576" AND OrderID < 29 
ORDER BY OrderID DESC LIMIT 1

我需要:

OrderID
13

但它会返回这个:

OrderID
28

然后我尝试从ORDER BY 中删除DESC

SELECT OrderID 
FROM Orders 
WHERE CustomerID = "1808317576" AND OrderID < 29 
ORDER BY OrderID LIMIT 1

但它会返回这个:

OrderID
1

我怎样才能得到 13?!

【问题讨论】:

  • SQLite 支持窗口函数。这可能是一个不错的起点:sqlite.org/windowfunctions.html
  • @crcvd 对于这样一个简单的要求,不需要窗口函数。事实上,在这里使用 ROW_NUMBER 性能会差很多。

标签: sqlite sql-order-by sql-limit


【解决方案1】:

添加OFFSET 8跳过返回的前8行并设置LIMIT 1

SELECT OrderID 
FROM Orders 
WHERE CustomerID = '1808317576' AND OrderID < 29 
ORDER BY OrderID DESC 
LIMIT 1 OFFSET 8

或者更简单:

SELECT OrderID 
FROM Orders 
WHERE CustomerID = '1808317576' AND OrderID < 29 
ORDER BY OrderID DESC 
LIMIT 8,1

【讨论】:

    【解决方案2】:

    只需子查询您当前的查询并以相反(升序)方向排序,限制为 1:

    SELECT OrderID
    FROM
    (
        SELECT OrderID
        FROM Orders
        WHERE CustomerID = '1808317576' AND OrderID < 29
        ORDER BY OrderID DESC
        LIMIT 9
    ) t
    ORDER BY OrderID
    LIMIT 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2020-08-05
      • 2013-02-23
      相关资源
      最近更新 更多