SQLite中LEAD和LAG的替代品

时间:2018-12-05 10:48:02

标签: android sql sqlite

我需要找到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排序(请参见给出n示例中的ID 2、6和7)

我需要一种通过ID来查询条目前后的条目的方法。

例如对于_id = 6,我需要一个查询来选择_id = 2的行,并选择一个查询来选择_id = 7的行。
另外,选择两个查询的单个查询将同样有效。

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

2 个答案:

答案 0 :(得分:2)

尝试类似的方法,这将使用您的排序顺序(按日期+ 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) |

答案 1 :(得分:1)

如果表看起来像这样,则最终选择将是微不足道的。

_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的行数。您可以使用这种结构创建一个虚拟视图来驱动主选择。

这是一种可能的方法。由于您不是在请求“整个查询”,因此我将由您自己决定如何实现这一想法。