如何将 SQL 中的数据转换成这种形式:
How to convert data into this form in SQL :
输入:
我必须将数据从输入转换为输出。我们尝试如果 id freq 是 n 然后创建该 id 的 n 行。
输出:
在 Presto 中,一个选项使用 sequence()
和横向连接来生成行:
select t.id, x.value
from mytable t
cross join lateral unnest(sequence(1, t.freq)) as x(value)
order by t.id, x.value
好问题 - 一种方法是使用 table 整数 - 如果你确定永远不会超过(比如说)128 次重复,你可以创建 table 整数,如下所示:
CREATE TABLE nums(i INT PRIMARY KEY);
INSERT INTO nums VALUES (1);
INSERT INTO nums SELECT 1+i FROM nums;
INSERT INTO nums SELECT 2+i FROM nums;
INSERT INTO nums SELECT 4+i FROM nums;
INSERT INTO nums SELECT 8+i FROM nums;
INSERT INTO nums SELECT 16+i FROM nums;
INSERT INTO nums SELECT 32+i FROM nums;
INSERT INTO nums SELECT 64+i FROM nums;
现在您可以使用 table:
SELECT id, i AS value
FROM input JOIN nums ON i BETWEEN 1 AND Freq
我会像 GMB 显示的那样用 Lateral 来做。在 SQL 服务器中,它可以用另一种方式完成,例如下面的例子:
with tally as
(
select top(select max(v) from myTable)
ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N
FROM Master.sys.All_Columns t1
CROSS JOIN Master.sys.All_Columns t2
)
select m.id, t.N
from tally t
cross join myTable m
where t.N <= m.v
order by m.id, t.N;
输入:
我必须将数据从输入转换为输出。我们尝试如果 id freq 是 n 然后创建该 id 的 n 行。
输出:
在 Presto 中,一个选项使用 sequence()
和横向连接来生成行:
select t.id, x.value
from mytable t
cross join lateral unnest(sequence(1, t.freq)) as x(value)
order by t.id, x.value
好问题 - 一种方法是使用 table 整数 - 如果你确定永远不会超过(比如说)128 次重复,你可以创建 table 整数,如下所示:
CREATE TABLE nums(i INT PRIMARY KEY);
INSERT INTO nums VALUES (1);
INSERT INTO nums SELECT 1+i FROM nums;
INSERT INTO nums SELECT 2+i FROM nums;
INSERT INTO nums SELECT 4+i FROM nums;
INSERT INTO nums SELECT 8+i FROM nums;
INSERT INTO nums SELECT 16+i FROM nums;
INSERT INTO nums SELECT 32+i FROM nums;
INSERT INTO nums SELECT 64+i FROM nums;
现在您可以使用 table:
SELECT id, i AS value
FROM input JOIN nums ON i BETWEEN 1 AND Freq
我会像 GMB 显示的那样用 Lateral 来做。在 SQL 服务器中,它可以用另一种方式完成,例如下面的例子:
with tally as
(
select top(select max(v) from myTable)
ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N
FROM Master.sys.All_Columns t1
CROSS JOIN Master.sys.All_Columns t2
)
select m.id, t.N
from tally t
cross join myTable m
where t.N <= m.v
order by m.id, t.N;