2

我正在使用 SnowflakeDB 并有下表

Key  Seats
 a    7,7
 b    6,8

我想将其展平,同时在两个数字之间生成座位。我得到了 flatten 部分,但无法弄清楚如何在两个提供的数字之间生成座位。

select a.*, b.val from mytable a, lateral flatten(input=> split(Seats,','))

上面的查询将生成下表。

Key  Seats
 a     7
 a     7
 b     6
 b     8

b座位少了一个七。我希望最终结果是

Key  Seats
 a     7
 a     7
 b     6
 b     7
 b     8

谢谢你。

4

1 回答 1

1

最简单的方法是在展平之前添加一个 JavaScript 函数,该函数会为您的输入创建一个具有密集序列的数组。

例如:

create or replace table mytable(key varchar, seats varchar) as
select * from values
    ('a', '7,7'), 
    ('b', '6,9');

create or replace function fillme(STR varchar)
returns variant
language javascript
as '
let start = 1 * STR.split(",")[0];
let end = 1 * STR.split(",")[1];
let res = [];
for (let s = start; s <= end; s++) {
  res.push(s);
}
return res;
'
;
/
select key, seats, fillme(seats) from mytable;
select a.*, b.value from mytable a, lateral flatten(input=> fillme(Seats)) b;

最后 2 个查询的输出是:

select key, seats, fillme(seats) from mytable;
-----+-------+---------------+
 KEY | SEATS | FILLME(SEATS) |
-----+-------+---------------+
 a   | 7,7   | [             |
     |       |   7           |
     |       | ]             |
 b   | 6,9   | [             |
     |       |   6,          |
     |       |   7,          |
     |       |   8,          |
     |       |   9           |
     |       | ]             |
-----+-------+---------------+
2 rows in result (first row: 421 msec; total: 423 msec)
select a.*, b.value from mytable a, lateral flatten(input=> fillme(Seats)) b;
-----+-------+-------+
 KEY | SEATS | VALUE |
-----+-------+-------+
 a   | 7,7   | 7     |
 b   | 6,9   | 6     |
 b   | 6,9   | 7     |
 b   | 6,9   | 8     |
 b   | 6,9   | 9     |
-----+-------+-------+

假设您没有数百万个座位,这应该足够了。

于 2018-02-02T06:01:54.953 回答