首页 > 解决方案 > 将作为范围的单元格值展平为列

问题描述

我有一个表格,其中有一列用于文档的页面范围,并且想要扩展表格,以便该范围中的每一页都是它自己的行。

我有:

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

标签: sqlprestoamazon-athena

解决方案


你可以

  • 使用提取范围界限regexp_extract
  • 使用将范围边界转换为值列表sequence
  • 使用扁平化CROSS JOIN 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)

推荐阅读