获取列和关联列名之间的最大值
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
【讨论】:
以上是关于获取列和关联列名之间的最大值的主要内容,如果未能解决你的问题,请参考以下文章