首页 > 解决方案 > SQLite 中 LEAD 和 LAG 的替代方案

问题描述

我需要找到 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 行的查询。
或者,选择两者的查询单个查询也同样有效。

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

标签: androidsqlsqlite

解决方案


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

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) |

推荐阅读