SQL 连接:取消具有相同列名(但不同数据)的行的嵌套,无需使用别名

问题描述 投票:0回答:1

假设我有三张桌子:
t1:

client_id 传输_id 时间戳 列_A
1 AAA1 2024-10-16 10:31:27 香蕉
1 AAA2 2024-10-16 11:31:27 柑橘
2 BBB1 2024-10-16 09:12:14 苹果

t2:

client_id 传输_id 时间戳 栏_B
1 AAA1 2024-10-16 10:41:27 巴黎
1 AAA2 2024-10-16 11:41:27 伦敦
2 BBB1 2024-10-16 09:22:14 纽约

t3:

client_id 传输_id 时间戳 栏_C
1 AAA1 2024-10-16 10:31:27
1 AAA2 2024-10-16 11:31:27 祈祷
2 BBB1 2024-10-16 09:12:14

您可能会注意到,虽然 client_idtransmission_idtimestamp(我之前用作连接键)与 t1t3 匹配,但时间戳数据在 t2 中不匹配。

我想连接这些表,以便时间戳数据的差异不会嵌套到不同的行中:

client_id 传输_id 时间戳 列_A 栏_B 栏_C
1 AAA1 2024-10-16 10:31:27 香蕉
1 AAA1 2024-10-16 10:41:27 巴黎
1 AAA2 2024-10-16 11:31:27 柑橘 祈祷
1 AAA2 2024-10-16 11:41:27 伦敦
2 BBB1 2024-10-16 09:12:14 苹果
2 BBB1 2024-10-16 09:22:14 纽约

不幸的是,我对如何做到这一点有点困惑。

我尝试使用别名将不同的时间戳映射到它们自己的列(因为在没有时间戳作为键的情况下加入数据会导致歧义),例如:

client_id 传输_id t1_t3.时间戳 t2.时间戳 列_A 栏_B 栏_C
1 AAA1 2024-10-16 10:31:27 2024-10-16 10:41:27 香蕉 巴黎
1 AAA2 2024-10-16 11:31:27 2024-10-16 11:41:27 柑橘 伦敦 祈祷
2 BBB1 2024-10-16 09:12:14 2024-10-16 09:22:14 苹果 纽约

但我的愿望是拥有一个时间戳列,因为很难遵循这个玩具示例之外的“时间线”。

sql join pivot unnest
1个回答
0
投票

你需要这样做:

select client_id,transmission_id,timestamp 
  , max(column_A) as column_A
  , max(column_b) as column_B 
  , max(column_C) as column_C
from (
  select client_id,transmission_id,timestamp,column_A, null as column_B, null as column_c from t1
  union all 
  select client_id,transmission_id,timestamp,null as column_A, column_B, null as column_c from t2
  union all 
  select client_id,transmission_id,timestamp,null as column_A, null as column_B, column_c from t3
)
group by client_id,transmission_id,timestamp

输出:

client_id 传输_id 时间戳 列_a 列_b column_c
1 AAA2 2024-10-16 11:31:27 柑橘 祈祷
1 AAA2 2024-10-16 11:41:27 伦敦
2 BBB1 2024-10-16 09:22:14 纽约
1 AAA1 2024-10-16 10:41:27 巴黎
2 BBB1 2024-10-16 09:12:14 苹果
1 AAA1 2024-10-16 10:31:27 香蕉
© www.soinside.com 2019 - 2024. All rights reserved.