Sql 将范围内的单元格值展平为列

Sql 将范围内的单元格值展平为列,sql,presto,amazon-athena,Sql,Presto,Amazon Athena,我有一个表,其中有一列用于文档的页面范围,并希望扩展该表,以便该范围内的每个页面都是自己的行 我有: | document | type | page_range | | -------- | ---- | ---------- | | 1 | A | 1-3 | | 2 | B | 4-5 | 我想: | document | type | pages | | -------- | ---- | ----- | |

我有一个表,其中有一列用于文档的页面范围,并希望扩展该表,以便该范围内的每个页面都是自己的行

我有:

| document | type | page_range |
| -------- | ---- | ---------- |
|        1 |  A   |    1-3     |
|        2 |  B   |    4-5     |
我想:

| document | type | pages |
| -------- | ---- | ----- |
|        1 |  A   |   1   |
|        1 |  A   |   2   |
|        1 |  A   |   3   |
|        2 |  B   |   4   |
|        2 |  B   |   5   |
你可以

  • 使用
  • 使用将范围边界转换为值列表
  • 使用
    交叉连接UNNEST展平
像这样:

SELECT id, x
FROM (VALUES ('A', '1-3'), ('B', '4-5')) t(id, range)
CROSS JOIN UNNEST (
    sequence(
        CAST(regexp_extract(range, '(\d+)-(\d+)', 1) AS bigint),
        CAST(regexp_extract(range, '(\d+)-(\d+)', 2) AS bigint))
) s(x);
示例输出:

presto> SELECT id, x
     -> FROM (VALUES ('A', '1-3'), ('B', '4-5')) t(id, range)
     -> CROSS JOIN UNNEST (
     ->     sequence(
     ->         CAST(regexp_extract(range, '(\d+)-(\d+)', 1) AS bigint),
     ->         CAST(regexp_extract(range, '(\d+)-(\d+)', 2) AS bigint))
     -> ) s(x);
 id | x
----+---
 A  | 1
 A  | 2
 A  | 3
 B  | 4
 B  | 5
(5 rows)