【问题标题】:Compare the columns with largest value, and assign a value based on column name比较具有最大值的列,并根据列名分配值
【发布时间】:2021-06-29 21:27:31
【问题描述】:

我正在处理一个我不知道如何解决的案例,原始表格如下所示:

id typeA typeB typeC
1 3 5 1
2 2 4 5
3 2 2 1

我想根据 typeA、B 和 C 中的值添加一个分类。该分类将是具有最高值的分类,如果有平局,我将推无法决定。

所以输出看起来像这样。

id typeA typeB typeC classification
1 3 5 1 typeB
2 2 4 5 typeC
3 2 2 1 can't decide

我知道在这种情况下我可以使用 CASE WHEN,但是我们有很多“类型”列 (40+),有没有更好的方法来做到这一点?

非常感谢!

【问题讨论】:

  • 不,虽然有可能,但没有好的方法可以做到这一点。
  • 说可能是指使用 CASE WHEN 之类的东西吗?
  • @ErinLiu 建议的答案对您有用吗?

标签: sql amazon-athena


【解决方案1】:

如果有 40 多列,使用 CASE WHEN 来实现逻辑可能需要做很多工作。

CASE
    WHEN typeA > typeB AND typeA > typeC THEN 'typeA'
    ...etc
END

另一种方法可能是让数据库使用排名和聚合函数来完成工作,如下所示。我使用第一个 CTE all_data 对数据进行了反透视,并添加了一个元列。如果需要,您也可以探索这个 other amazon athena approach。然后我继续对数据进行排序以找出最大的类型。然后我确定是否有多个类型与行3 排名相同,其中typeA 和typeB 具有相同的值。然后一个案例声明决定我是使用实际类型还是can't decide。使用每个行 ID 的分类,然后我使用内部连接将此新列添加到最终投影中。请参阅下面的sample:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2021-09-09
    • 2018-01-30
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多