获取列和关联列名之间的最大值

Posted

技术标签:

【中文标题】获取列和关联列名之间的最大值【英文标题】:Get greatest value between columns and associated column name 【发布时间】:2015-04-30 18:51:57 【问题描述】:

我正在寻找一组列中的最大值以及列名。例如,给定:

| Id | A | B | C |
------------------
| 1  | 1 | 2 | 3 |

我希望:

| Id | Column | Value |
------------------------
| 1  |    C   |   3   |

我已经得到了查询的一部分来确定最大值,但我也在努力显示它来自哪一列。

SELECT Id,
(SELECT Max(v) 
FROM (VALUES (A), (B), (C)) AS value(v)) as MaxValue
FROM [dbo].[MyTable]

我觉得我真的很接近了,但我不知道如何完成这个。谢谢!

【问题讨论】:

如果您有 A = 1, B = 3, C = 3 的记录,您是否希望在输出中为该 id 提供两行? @Dan 这是一个很好的问题。业务逻辑确实允许这种行为,但我们还没有定义在这种情况下应该发生什么。我想应该显示两个/所有等效结果。列 = BC,值 = 3 【参考方案1】:

解决问题的一种方法(不是说这是最好的方法)是对列值进行排名,然后从该数据集中选择我们想要的。

首先取消透视您的记录:

select id
       , columnName
       , columnValue
from mytable
     unpivot
     (
        columnValue for columnName in(a,b,c)
     ) as unpvt

接下来,我们可以根据我们希望看到的输出为值分配排名。为了对 ID 第一的最大列值进行排名,我们添加:

select id
       , columnName
       , columnValue
       , rank() over (partition by id order by columnValue DESC, columnName DESC) as rankVal
    from mytable
    unpivot
    (
        columnValue for columnName in(a,b,c)
    ) as unpvt

请注意,在上面的rank() 中,如果我们仅按columnValue 排序,如果两列具有相同的最大值,您最终会得到两个排名 1。然后,下一步将返回两个记录为ID。如果这是您希望看到的输出,请从 rank() 订单中删除 , columnName DESC

现在我们已经对我们的值进行了排名,我们可以从该结果集中选择我们想要的:

with cteUnpivot(id, columnName, columnValue, rankVal)
AS
(
    select id
           , columnName
           , columnValue
           , rank() over (partition by id order by columnValue DESC, columnName DESC) as rankVal
    from mytable
    unpivot
    (
        columnValue for columnName in(a,b,c)
    ) as unpvt
)

select id
       , columnName as [Column]
       , columnValue as [Value]
from cteUnpivot
where rankVal = 1

【讨论】:

以上是关于获取列和关联列名之间的最大值的主要内容,如果未能解决你的问题,请参考以下文章

SQL:获取一列和相应的其他列的最大值[重复]

Pandas Pivot 表通过列名获取最大值

熊猫,对于每一行获取两列之间最大列的值

scala:从变量列列表中获取与最大列值对应的列名

Teradata SQL:最大(最大)、第二和第三大列名

绪论—最大子列和问题