[英]Compare the columns with largest value, and assign a value based on column name
我正在處理一個我不知道如何解決的案例,原始表如下所示:
ID | A型 | B型 | C型 |
---|---|---|---|
1 | 3 | 5 | 1 |
2 | 2 | 4 | 5 |
3 | 2 | 2 | 1 |
我想根據typeA,B和C的值添加一個分類。分類將是具有最高值的分類,如果有平局,我將無法決定。
所以輸出看起來像這樣。
ID | A型 | B型 | C型 | 分類 |
---|---|---|---|---|
1 | 3 | 5 | 1 | B型 |
2 | 2 | 4 | 5 | C型 |
3 | 2 | 2 | 1 | 不能決定 |
我知道在這種情況下我可以使用 CASE WHEN,但是我們有很多“類型”列(40+),有沒有更好的方法來做到這一點?
非常感謝!
對於 40 多列,使用 CASE WHEN 實現邏輯可能需要大量工作,例如。
CASE
WHEN typeA > typeB AND typeA > typeC THEN 'typeA'
...etc
END
另一種方法可能是讓數據庫使用排名和聚合函數來完成工作,如下所示。 我用第一個 CTE all_data 對數據進行了all_data
並添加了一個元列。 如果需要,您還可以探索其他亞馬遜雅典娜方法。 然后我繼續對數據進行排名以找出最大的類型。 我然后確定是否有多種類型的排名相同類似排3
,其中typeA
和typeB
有同樣的價值。 然后一個 case 語句決定我是使用實際類型還是can't decide
。 使用每一行 id 的分類,然后我使用內部連接將此新列添加到最終投影中。 請參閱下面的示例:
WITH all_data AS (
SELECT id, typeA as val, 'typeA' as type from my_table UNION ALL
SELECT id, typeB as val, 'typeB' as type from my_table UNION ALL
SELECT id, typeC as val, 'typeC' as type from my_table
),
ranked_data AS (
SELECT
id,
val,
type,
rank() over (partition by id order by val desc) as rnk
FROM
all_data
),
classification AS (
SELECT
id,
CASE
WHEN COUNT(id) > 1 THEN 'undecided'
ELSE MAX(type)
END as class_type
FROM
ranked_data
WHERE rnk=1
GROUP BY id
)
SELECT
m.*,
c.class_type as classification
FROM
my_table m
INNER JOIN
classification c ON c.id = m.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.