在 RedShift 中将值拆分为多行

2024-02-12

如何将字段(例如 CSV 字符串)拆分为多行的问题已经得到解答:将值拆分为多行 https://stackoverflow.com/questions/13159526/split-values-over-multiple-rows.

然而,这个问题涉及 MSSQL,并且答案使用了 RedShift 没有等效项的各种功能。

为了完整起见,这是我想做的一个示例:

当前数据:

| Key | Data     |
+-----+----------+
| 1   | 18,20,22 |
| 2   | 17,19    |

所需数据:

| Key | Data     |
+-----+----------+
| 1   | 18       |
| 1   | 20       |
| 1   | 22       |
| 2   | 17       |
| 2   | 19       |

现在,我可以建议针对 CSV 字段中元素数量较小、有界的情况采取一种解决方法:对所有可能的数组位置使用 split_part 和 union,如下所示:

SELECT Key, split_part(Data, ',', 1) 
FROM mytable
WHERE split_part(Data, ',', 1) != ""
    UNION
SELECT Key, split_part(Data, ',', 2) 
FROM mytable
WHERE split_part(Data, ',', 2) != ""
-- etc. etc.

然而,这显然效率很低,并且不适用于较长的列表。

关于如何做到这一点有更好的想法吗?

EDIT:

关于行相乘还有一个有点类似的问题:在 Redshift 中拆分行 https://stackoverflow.com/questions/22779150/splitting-rows-in-redshift。但是我不知道如何在这里应用这种方法。

EDIT 2:

可能的重复:红移。将逗号分隔的值转换为行 https://stackoverflow.com/questions/25112389/redshift-convert-comma-delimited-values-into-rows。但没什么新鲜的 - @Masashi Miyazaki 的答案与我上面的建议类似,并且遇到了同样的问题。


这是 Redshift 的答案,它每行最多可处理 10000 个值。

设置测试数据

create table test_data (key varchar(50),data varchar(max));
insert into test_data
    values
      (1,'18,20,22'),
      (2,'17,19')
;

code

with ten_numbers as (select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0)
  , generted_numbers AS
(
    SELECT (1000 * t1.num) + (100 * t2.num) + (10 * t3.num) + t4.num AS gen_num
    FROM ten_numbers AS t1
      JOIN ten_numbers AS t2 ON 1 = 1
      JOIN ten_numbers AS t3 ON 1 = 1
      JOIN ten_numbers AS t4 ON 1 = 1
)
  , splitter AS
(
    SELECT *
    FROM generted_numbers
    WHERE gen_num BETWEEN 1 AND (SELECT max(REGEXP_COUNT(data, '\\,') + 1)
                                 FROM test_data)
)
  , expanded_input AS
(
    SELECT
      key,
      split_part(data, ',', s.gen_num) AS data
    FROM test_data AS td
      JOIN splitter AS s ON 1 = 1
    WHERE split_part(data, ',', s.gen_num) <> ''
)
SELECT * FROM expanded_input
order by key,data;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 RedShift 中将值拆分为多行 的相关文章

随机推荐

  • Facebook 聊天 API - php

    我已经成功通过 xmpp 协议登录 Facebook 我使用了 facebook 文档中提供的 PHP 代码
  • 自定义ipython笔记本的欢迎页面

    我可以自定义 iPython 笔记本服务器 版本 2 3 的登录页面吗 我的意思是 在起始页 类似于 http localhost 8888 tree 我想显示欢迎来到 John Doe 的 i Py 笔记本或修改现有横幅 这可能吗 您可以
  • Mac OS X /bin/bash:python:在某些 IDE 中找不到命令

    当我编译的时候test py 一个非常简单的Python文件 在Sublime Text或CodeRunner中 我收到错误 bin bash python command not found 然后我输入python test py在终端应
  • Swing Worker 模态对话框不会关闭

    我有一个 SwingWorker 线程 它启动一个模式对话框 从侦听启动的 StateValue 的属性更改侦听器 并且 swing 工作线程继续执行其工作 但是 看起来 did 方法没有被调用 因为它是在 EDT 上调用的 但 swing
  • Numpy 数组到 TFrecord

    我正在尝试通过张量流对象检测 API 训练自定义数据集 数据集包含 40k 训练图像和标签 采用 numpy ndarray 格式 uint8 训练数据集形状 2 40000 23456 和标签形状 1 0 3 我想为此数据集生成 tfre
  • 如何升级pip3?

    I want to use python3 5 for development but many times when I install the module for python 3 5 it always fails The term
  • 派生类型中的可变长度数组

    我主要使用 Python 进行科学编程 并没有大量的 Fortran 90 95 经验 对于我的一个项目 我想定义一个派生类型并为该类型重载一堆运算符 至关重要的是 我希望派生类型的变量之一成为可变长度的数组 至少 我在代码的不同部分需要两
  • 删除 tar 生成的尾随空字符

    我正在尝试压缩一些文件并通过 php passthru 命令将它们传递给用户 问题是 尽管 tar 文件应该只有 2k 大小 但它始终是 10240 有趣的数字对吗 所以我把它分解为 sh 4 1 tar czf test wc c 102
  • iPhone 上针对 RTL 语言的翻转布局

    这是我的问题 我已将我的应用程序本地化为阿拉伯语 它实际上与常规本地化略有不同 因为我有不同的目标 每种语言一个 在模拟器上 由于自动布局和约束的前导 尾随部分 视图被正确翻转 但我似乎无法在设备上获得相同的结果 AutoLayout RT
  • bash 创建带有序列号的目录

    我正在创建一个在 OS X 上运行的脚本 该脚本将由新手用户经常运行 因此希望通过每次创建一个新的目录结构并在最后一个上使用 n 1 来保护目录结构 target001下一次运行创建target002 到目前为止我有 lastDir fin
  • 重置按钮处理点击后执行 Javascript 操作

    如何立即执行某项操作after an
  • EF Core 查询存储过程映射到类型

    我有一个项目需要查询数据库并将结果返回到 Web api 有几个由数据库管理员即时创建的存储过程 它们有一个 UI 用于创建存储过程的定义及其名称 而 Web API 服务仅调用该 SP 并应返回结果 根据下面的代码 我无法将返回对象获取到
  • 我在 for 循环中使用 let 关键字给出了语法错误:意外的标识符

    我在 for 循环中使用 let 关键字 如下所示 for let methd1 in servUrl let methd methd1 for let pth1 in servUrl methd let pth pth1 app meth
  • 有没有办法使用 cron 重新启动 pm2 进程,但前提是它尚未运行?

    我想通过 PM2 重新启动我的 Node Js 应用程序 pm2 restart app js 使用 crontab 但仅当应用程序尚未运行时 例如 如果我的服务器崩溃并重新启动并且 pm2 没有重新启动 即使它正在运行 上面的命令也会重新
  • TensorFlow的map_fn仅在CPU上运行

    我在尝试获取 TensorFlow 时遇到了一个奇怪的问题map fn在我的 GPU 上运行 这是一个最小的损坏示例 import numpy as np import tensorflow as tf with tf Session as
  • Log4net 日志记录不适用于并行线程

    我在随机数上使用基本的 Parallel Foreach 循环来使用 log4net 记录数字本身 这是我在并行线程上记录 5000 条消息的代码 Logger logger new Logger var numbers Enumerabl
  • Javascript 中是否按顺序执行相等的超时?

    假设我这样做 setTimeout foo 0 setTimeout bar 0 我可以确定 foo 会在 bar 之前开始执行吗 如果我使用 1 10 或 100 的超时值代替 0 会怎么样 简单的实验表明 在超时值相等的情况下 超时目标
  • XElement 添加一个 xmlns

    我正在使用 Linq to XML 创建一个新的 XML 文件 我从现有的 XML 文件中获取该文件的某些部分 我为此使用以下代码 var v2 new XDocument new XDeclaration 1 0 utf 16 new X
  • 使用 Mongoose 更新 _id = :id 的记录

    我正在尝试使用 Mongoose 更新现有记录 插入可以 但更新不行 这是我的片段 app post submit function req res var my visit new models visits date req body
  • 在 RedShift 中将值拆分为多行

    如何将字段 例如 CSV 字符串 拆分为多行的问题已经得到解答 将值拆分为多行 https stackoverflow com questions 13159526 split values over multiple rows 然而 这个