【问题标题】:How to convert data into this form in SQL :如何在 SQL 中将数据转换成这种形式:
【发布时间】:2020-11-23 09:13:47
【问题描述】:

输入:

我必须将数据从输入转换为输出。我们尝试如果 for id freq 为 n 则创建该 id 的 n 行。

输出:

【问题讨论】:

  • Presto MySQL。我删除了这些冲突的标签,请仅重新标记您正在运行的一个数据库。
  • 我在您的图片中看不到任何内容,只有空框。无论如何,请不要将代码和数据发布为(链接到)图像,而是以格式化文本形式发布
  • 现在可以正常工作了。请检查
  • “然后创建 n 列” - 你的意思是行吗?

标签: sql arrays presto recursive-query unnest


【解决方案1】:

在 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

【讨论】:

  • 如果你能提供某种 DB fiddle 那就太棒了。
  • @Abra:不幸的是,没有我知道的 Presto fiddle...
  • @Abra, GMB re fiddle -- 见twitter.com/findepi/status/1281329811026305030。如果有兴趣,我很乐意为 Presto 方面提供帮助。
【解决方案2】:

很好的问题 - 一种方法是使用整数表 - 如果您确定永远不会超过(比如说)128 次重复,您可以按如下方式创建整数表:

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;

现在您可以使用该表了:

SELECT id, i AS value
 FROM input JOIN nums ON i BETWEEN 1 AND Freq

【讨论】:

    【解决方案3】:

    正如 GMB 所展示的那样,我会使用横向来做到这一点。然而,在 SQL Server 中,它可以以另一种方式完成,例如:

    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;
    

    DBFiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多