生成两个数字之间的值并展平 table
Generate values between two numbers and flatten the table
我正在使用 SnowflakeDB 并具有以下 table
Key Seats
a 7,7
b 6,8
我想把它压平,同时在两个数字之间生成座位。我得到了展平部分,但无法弄清楚如何在两个提供的数字之间生成座位。
select a.*, b.val from mytable a, lateral flatten(input=> split(Seats,','))
上面的查询将生成下面的 table。
Key Seats
a 7
a 7
b 6
b 8
b 位少了 7 个。我希望最终结果是
Key Seats
a 7
a 7
b 6
b 7
b 8
谢谢。
最简单的方法是添加一个 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 |
-----+-------+-------+
假设您没有数百万个席位,这应该足够了。
我正在使用 SnowflakeDB 并具有以下 table
Key Seats
a 7,7
b 6,8
我想把它压平,同时在两个数字之间生成座位。我得到了展平部分,但无法弄清楚如何在两个提供的数字之间生成座位。
select a.*, b.val from mytable a, lateral flatten(input=> split(Seats,','))
上面的查询将生成下面的 table。
Key Seats
a 7
a 7
b 6
b 8
b 位少了 7 个。我希望最终结果是
Key Seats
a 7
a 7
b 6
b 7
b 8
谢谢。
最简单的方法是添加一个 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 |
-----+-------+-------+
假设您没有数百万个席位,这应该足够了。