【问题标题】:Alternatives to LEAD and LAG in SQLiteSQLite 中 LEAD 和 LAG 的替代方案
【发布时间】:2018-12-05 10:48:02
【问题描述】:

我需要找到 LAG 和 LEAD 的替代方法,以便在我的 SQLite 表中查找上一个和下一个条目,因为使用的版本不支持这些条目(不支持更新)。
但我也不能使用我订购的值,因为它可以是一个日期,因此在多个条目上可以是相同的。
由于表格必须按日期排序,因此也不能使用 ID。

如果有人知道解决此问题的另一种方法,那就太好了,因为经过一个多小时的搜索和尝试,我已经没有想法了。

编辑:

我的用例的重要列是:

_id     booking_date
  1       2017:11-21
  3       2017:11-21
  4       2017:11-21
  5       2017:11-21
  2       2017:11-22
  6       2017:11-22
  7       2017:11-22
...

_id 是主键。
预订需要按日期排序。
多个预订可能具有相同的日期。
相同日期的预订按其 id 排序(请参见示例中的 id 2、6 和 7)

我需要一种方法来通过其 id 查询条目之前和之后的条目。

例如,对于 _id=6,我需要一个选择 _id=2 行的查询和一个选择 _id=7 行的查询。
或者,同时选择两者的单个查询也可以正常工作。

我不需要您提供完整的查询,而是提供解决此问题的方法。

【问题讨论】:

  • 请提供样本数据和期望的结果。为了使用lead()/lag(),您的桌子无论如何都需要稳定的排序。哪些键提供稳定的排序?
  • 我希望提供的进一步信息和示例有用。
  • 。 . . SQL 表代表 无序 集。您甚至没有使用_id 进行订购,因此您提供的数据无法回答您的问题。
  • 在实际表中,_id 当然是用于订购的。但该表代表预订。每个预订都有一个 id、一个表示该预订执行时间的日期 [不是创建时间] 以及与该预订相关的所有值,这对于此任务并不重要。在显示预订列表时,按日期而不是按 ID 对预订进行排序是有意义的。但是为了只查询以前的预订,不能只使用日期,因为每个日期可以有多个预订。但实际上有一个解决方案,你显然没有想到。

标签: android sql sqlite


【解决方案1】:

尝试类似的方法,这会使用您的排序顺序(按日期 + id)检索给定记录的上一个和下一个 id - 假设 id 是主键,您可以使用检索其他列和 prev-next 记录这些 ID:

SELECT *,
      (SELECT id FROM t t1
       WHERE t1.booking_date < t.booking_date
          OR t1.booking_date = t.booking_date AND t1.id < t.id
       ORDER BY booking_date DESC, ID DESC LIMIT 1 ) prev_id,
      (SELECT id FROM t t1
       WHERE t1.booking_date > t.booking_date
          OR t1.booking_date = t.booking_date AND t1.id > t.id
       ORDER BY booking_date , ID  LIMIT 1 ) next_id 
FROM t
order by booking_date, id

演示:http://www.sqlfiddle.com/#!5/17631/2

| id | booking_date | prev_id | next_id |
|----|--------------|---------|---------|
|  1 |   2017-11-21 |  (null) |       3 |
|  3 |   2017-11-21 |       1 |       4 |
|  4 |   2017-11-21 |       3 |       5 |
|  5 |   2017-11-21 |       4 |       2 |
|  2 |   2017-11-22 |       5 |       6 |
|  6 |   2017-11-22 |       2 |       7 |
|  7 |   2017-11-22 |       6 |  (null) |

【讨论】:

  • 聪明的答案和无滞后的方法。谢谢!
【解决方案2】:

如果表格看起来像这样,最终的选择将相当简单。

_id     booking_date   seq
  1       2017:11-21    1
  3       2017:11-21    2
  4       2017:11-21    3
  5       2017:11-21    4
  2       2017:11-22    1
  6       2017:11-22    2
  7       2017:11-22    3

seq 是同一booking_date 中id 较小的行数。您可以使用这种结构创建一个虚拟视图来驱动主选择。

这是一种可能的方法。由于您没有征求“整个查询”,因此我将如何实现这个想法留给您。

【讨论】:

  • 但既然看起来不像这样,这个答案根本没有帮助,是吗?
  • @Jujinko 你欠我一票。注意最后一行You could create a virtual view with this structure to drive the main select. 。换句话说,创建一个确实看起来像这样的结构。事实上,我确实创建了一个复制品,但 OP 想要一种“方法”而不是“整个查询”。感谢您解释反对意见,并让我有机会反驳和澄清我的答案。
猜你喜欢
  • 2023-03-05
  • 2018-04-14
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多