簡體   English   中英

比較具有最大值的列,並根據列名賦值

[英]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 ,其中typeAtypeB有同樣的價值。 然后一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM