我正在处理一些数据,这些数据概述了一个人希望的接收消息的方式。有些客户在不同的两行列出了两种方法。我想每个 ID 只有一行。这意味着如果一个人列出了两种交付方式,则应将第二种方式放入行secondary_delivery_method。我将如何为使用不同方法重复的客户创建新行并消除第二行?
快速示例:
ID | 名字 | 姓氏 | 偏好 |
---|---|---|---|
1 | 约翰 | 史密斯 | 文字 |
1 | 约翰 | 史密斯 | 邮件 |
--- 应该是 ---
ID | 名字 | 姓氏 | 主要方法 | 次要方法 |
---|---|---|---|---|
1 | 约翰 | 史密斯 | 文字 | 邮件 |
你可以这样做:
select
id,
max(first_name) as first_name,
max(last_name) as last_name,
max(case when rn = 1 then preference end) as primary_method,
max(case when rn = 2 then preference end) as secondary_method
from (
select t.*, row_number() over(partition by id) as rn
from t
) x
group by id;
结果:
ID FIRST_NAME LAST_NAME PRIMARY_METHOD SECONDARY_METHOD
---- ------------ ----------- ---------------- ------------------
1 John Smith Text Mail
2 Anne Doe Twitter null
参见 db<>fiddle 的运行示例。我添加了一个额外的行 (Anne) 来显示分组。