如何使用来自 1 列的数据创建 2 列并合并它们

Posted

技术标签:

【中文标题】如何使用来自 1 列的数据创建 2 列并合并它们【英文标题】:How to create 2 columns using data from 1 column and merging them 【发布时间】:2021-12-29 05:01:59 【问题描述】:

我在大查询中遇到了一些问题,单列无法分成 2 列。我希望具有 8 和 10 的列索引是使用“值”列中的值称为 Universal_id 和 project_id 的新列。

我当前的表是:

user_id | index | value
a.      | 1.    | 123
b.      | 8.    | 456
c.      | 10.   | 12.60
b.      | 10.   | 789

我希望结果是这样的:

user_id | project_id | universal_id | 
a       | NA         | NA
b.      | 789        | 456
c.      | 12.60      | NA

我试过这个,但它不起作用。我搜索了很多地方,并且可以找到我正在寻找的答案。任何帮助将不胜感激。提前谢谢!!!

select user_id,
case when index = 8 then value else null end as universal_id,
case when index = 10 then value else null end as ps_project_id

from test_1

【问题讨论】:

【参考方案1】:

您可以在这里使用条件聚合:

SELECT
    user_id,
    MAX(CASE WHEN index = 10 THEN value END) AS project_id,
    MAX(CASE WHEN index = 8  THEN value END) AS universal_id
FROM test_1
GROUP BY user_id;

【讨论】:

请问这里MAX函数的作用是什么?我知道它返回最大值,查询是否也返回不同的值?我试过没有 MAX 功能,它不起作用。我很好奇,我想知道这个查询是如何工作的。无论如何,非常感谢您的回答,它有效! @FastBoi MAX 技巧的工作原理是在 index 为 8 或 10 时采用 value。对于任何 other 索引值,CASE 表达式返回被忽略的NULL @Tim Biegeleisen 我明白了,所以 MAX 函数忽略了不是 8 或 10 的索引。谢谢!【参考方案2】:

考虑以下方法

select * from your_table
pivot (
  min(value) for case index 
    when 10 then 'project_id' 
    when 8 then 'universal_id' 
  end in ('project_id', 'universal_id')
)    

如果应用于您问题中的样本数据 - 输出是

【讨论】:

此解决方案也有效。谢谢你的插话,米哈伊尔!

以上是关于如何使用来自 1 列的数据创建 2 列并合并它们的主要内容,如果未能解决你的问题,请参考以下文章

在包含记录的现有表中,如何创建一个新的 datetime2(2) 列并使用基于另一列的值填充它?

如何在 Map 类型的数据框中获取一列并创建一个字符串,该字符串只是 Map 列的键/值

合并两个具有重叠 MultiIndex 列的 DataFrame

如何合并来自上下文相关的两列的数据?

如何在遍历熊猫数据框时创建新列并插入行值

选择 2 列并合并数据