将列添加到 SQL 表并使用该列的一组固定值分解行

Posted

技术标签:

【中文标题】将列添加到 SQL 表并使用该列的一组固定值分解行【英文标题】:Adding a column to an SQL table and exploding the rows with a set of fixed values for that column 【发布时间】:2021-06-09 20:54:58 【问题描述】:

我想向包含未知列的 SQL 表中添加一列,并按该列的一组固定值分解该表中的条目。例如。转

unknown col 1 ... unknown col x
1 ... foo
2 ... bar

进入

unknown col 1 ... unknown col x new col
1 ... foo 1
2 ... bar 1
1 ... foo 2
2 ... bar 2

未知列的数量也是未知的。我知道将原始表转换为的查询

unknown col 1 ... unknown col x new col
1 ... foo 1
2 ... bar 1

我不知道INSERT 查询会将其转换为上方所需的表。该表位于 Google BigQuery 上。

ps:我可以想到解决方法,例如将原始表中的行数乘以n,其中n是新列可以取的值的数量,然后添加列并根据行号设置值(这不是简单的设置)对于每一行。我正在寻找一种更清洁的方式。

【问题讨论】:

如果您不知道这些列是什么(即“未知列”),那么我完全不清楚如何添加它们。 我也是。这就是我想要弄清楚的。 你至少知道主键列吗? 【参考方案1】:

向具有未知列的 SQL 表中添加一列,并按该列的一组固定值分解该表中的条目。

下面应该做“技巧” - 示例

with new_col_values as (
  select [1, 2, 3, 4] values
)
select t.*, val
from `project.dataset.your_table` t, 
new_col_values, unnest(values) val

【讨论】:

在添加新列之前或之后会起作用吗?我都不会说。 (不是冲洗,只是仔细检查)。 不确定您的评论是什么意思-上面的内容完全符合您的要求!试试看,玩弄它:o) 只是为了澄清 - 上面的 select 语句可用于创建与您的“规范”匹配的新表,因此您可以与 CREATE TABLE ... 或 CREATE OR REPLACE TABLE ... 一起使用跨度> 你能解释一下发生了什么吗? - 具体来说,from 子句之后的部分。 您将您的表与包含固定值列表的 CTE 交叉连接,然后将该列表取消设置为这些值的集合,然后再次与原始表交叉连接 - 这会给您预期的结果。

以上是关于将列添加到 SQL 表并使用该列的一组固定值分解行的主要内容,如果未能解决你的问题,请参考以下文章

将列的值与该列 SQL 的平均值进行比较

Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值

SQL Server 2012 如何将列的数据类型从位更改为日期字段?

将列添加到包含其他列值列表的 pandas DataFrame

为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表

对 Spark 数据框中的行进行洗牌