【问题标题】:Is it possible to select multiple offsets with SQL是否可以使用 SQL 选择多个偏移量
【发布时间】:2020-02-14 12:32:36
【问题描述】:

我想用一个 SELECT SQL 查询选择多个偏移量。这可能吗?

例如,假设我有一个名为 dates 的非连续日期表。

date
----------
2020-01-01
2020-01-09
2020-01-16
2020-01-22
2020-01-29
2020-02-01
2020-02-04
2020-02-10
2020-02-13

我想选择最近日期的第 1、第 4 和第 7 个偏移量。在本例中,查询应返回:

offset    date
------    -------
1         2020-02-10
4         2020-01-29
7         2020-01-09

理想情况下,我想编写如下查询:

SELECT
    *
FROM
    dates
ORDER BY
    date DESC
OFFSET
    (1, 4, 7)

显然,由于 LIMIT/OFFSET 子句,这不会编译。

我可以尝试一个 UNION,但这不仅非常冗长而且不起作用,因为 LIMIT/OFFSET 子句必须在最后一个 UNION 之后。

失败:

SELECT 1, date FROM dates ORDER BY date DESC LIMIT 1 OFFSET 1
UNION
SELECT 4, date FROM dates ORDER BY date DESC LIMIT 1 OFFSET 4
UNION
SELECT 7, date FROM dates ORDER BY date DESC LIMIT 1 OFFSET 7

是否有一个优雅的查询来做到这一点?我能想到的另一个选择是将 row_number() 与窗口函数一起使用,然后执行SELECT * WHERE row_number IN (1, 4, 7) 之类的操作。但是,在某些情况下,我不得不使用不支持窗口函数的旧版 SQLite。

【问题讨论】:

  • 所以你总是想要 3 行,不管表中有数百行?
  • 没有。我希望偏移向量是动态的。可能是 100 项

标签: sql sqlite


【解决方案1】:

对于早期版本的 SQLite,您可以在 WHERE 子句中使用相关查询:

select t.date
from tablename t
where (select count(*) from tablename where date > t.date) in (1, 4, 7)

请参阅demo。
结果:

| date       |
| ---------- |
| 2020-01-09 |
| 2020-01-29 |
| 2020-02-10 |

如果您还想要offset 列:

select
  (select count(*) from tablename where date > t.date) offset,
  t.date
from tablename t
where offset in (1, 4, 7)
order by offset 

请参阅demo。
结果:

| offset | date       |
| ------ | ---------- |
| 1      | 2020-02-10 |
| 4      | 2020-01-29 |
| 7      | 2020-01-09 |

【讨论】:

    【解决方案2】:

    我想你想要row_number():

    select t.*
    from (select t.*,
                 row_number() over (order by date desc) as offset
          from t
          where date < date('now')  -- you might want local time
         ) t
    where offset in (1, 4, 7);
    

    【讨论】:

    • 戈登——这行得通。但是,我在完成帖子之前点击了提交。没有窗口功能可以做到这一点吗?在某些情况下,我必须使用没有该支持的旧版本 SQLite。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2013-01-08
    • 2018-02-02
    • 2023-03-13
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多