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)