如何使用来自 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 功能,它不起作用。我很好奇,我想知道这个查询是如何工作的。无论如何,非常感谢您的回答,它有效! @FastBoiMAX
技巧的工作原理是在 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 列的键/值