Выровнять значение ячейки, которое является диапазоном в столбцы - PullRequest
0 голосов
/ 26 июня 2019

У меня есть таблица, в которой есть столбец для диапазонов страниц документов, и я хочу расширить таблицу, чтобы каждая страница в диапазоне представляла собой собственную строку.

У меня есть:

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

1 Ответ

1 голос
/ 27 июня 2019

Вы можете

  • извлечь границы диапазона, используя 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)
...