【问题标题】:Outer join or union all to transform the rows into columns外连接或联合所有将行转换为列
【发布时间】:2019-07-02 16:06:20
【问题描述】:

我有什么:

 _______________________________________            
 | MachUUID | State|  Pass   | Fail    |   
 |--------------------------------------
 |  1234    | A    |   0.2   |    0.98 |  
 |  1234    | B    |   0.5   |    0.5  |  
 |  1234    | C    |   0.8   |    0.2  |
 ---------------------------------------

我想要什么:transformed_table

 | MachUUID | A_Pass | A_Fail | B_Pass | B_Fail | C_Pass | C_Fail
  --------------------------------------------------------------
 |  1234    |  0.2   | 0.98   |  0.5   |  0.5   | 0.8    |  0.2 

状态数(A、B 等是固定的)。目前,它们最多有 20 个。所以要改造这个

我在做什么

Transformed_Table AS (
SELECT MachUUID, Pass AS A_Pass, Fail AS A_Fail
FROM table
WHERE State = 'A'
UNION ALL

SELECT MachUUID, Pass AS B_Pass, Fail AS B_Fail
FROM table
WHERE State = 'B'
UNION ALL

SELECT MachUUID, Pass AS C_Pass, Fail AS C_Fail
FROM table
WHERE State = 'C')

但是,这会返回一个奇怪的联合,看起来像:

我得到错误的输出

| MachUUID | A_Pass| A_Fail |
|   1234   | 0.2   | 0.98   |
|   1234   | 0.5   | 0.5    |
|   1234   | 0.8   | 0.2    |

问题

我认为我对联合的理解在这一点上是不正确的。我了解外连接,并且想知道这是否是一种更好的方法。

我愿意接受其他解决此问题的方法的建议

【问题讨论】:

  • 常见的数据透视技术使用 GROUP BY 和条件聚合:modern-sql.com/use-case/pivot
  • @MarkusWinand 链接方法的问题是,我必须使用像 CASE state = 'A' then Pass End As A_Pass CASE state = 'A' then Fail End As A_Fail 这样的 case 语句。我不确定如果我有 2 个案例语句评估完全相同的案例,它们都会被执行

标签: sql join hive union-all


【解决方案1】:

您可以使用条件聚合来做到这一点:

select MachUUID,
       max(case when state = 'A' then pass end) as a_pass,
       max(case when state = 'A' then fail end) as a_fail,
       max(case when state = 'B' then pass end) as b_pass,
       max(case when state = 'B' then fail end) as b_fail,
       max(case when state = 'C' then pass end) as c_pass,
       max(case when state = 'C' then fail end) as c_fail
from t
group by MachUUID

【讨论】:

  • 从我正在阅读的一些文献中,我的理解是,如果我有两个案例,都评估完全相同的条件,RDBMS 明智地不检查两者。
  • @ExceptionHandler 。 . .在某些数据库中可能确实如此,但与移动数据的工作相比,这是一种微优化。
  • 我不确定我是否理解您的评论。我担心如果它以这种方式优化,我将永远无法了解全貌。例如,进行这种优化实际上会搞砸结果。
  • @ExceptionHandler 。 . .我不明白你的担心。如果case 表达式的then 部分被忽略,那将是一个错误。结果集应该是查询所表达的内容。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多