Sql server 查找出现最大值的多列(按行)和列名称的最大值(T-SQL)

Sql server 查找出现最大值的多列(按行)和列名称的最大值(T-SQL),sql-server,tsql,Sql Server,Tsql,我对T-SQL和高级概念/查询相当陌生,很难理解进一步描述的情况。比如说,我有一张这样的桌子: -------------------- | K | C1 | C2 | C3 | -------------------- | 1 | 14 | 24 | 48 | | 2 | 10 | 65 | 37 | | 3 | 44 | 90 | 22 | -------------------- -- how to get Col column? ----------------- | K | Max

我对T-SQL和高级概念/查询相当陌生,很难理解进一步描述的情况。比如说,我有一张这样的桌子:

--------------------
| K | C1 | C2 | C3 |
--------------------
| 1 | 14 | 24 | 48 |
| 2 | 10 | 65 | 37 | 
| 3 | 44 | 90 | 22 |
--------------------
-- how to get Col column?
-----------------
| K | Max | Col |
| 1 | 48  | C3  |
| 2 | 65  | C2  | 
| 3 | 90  | C2  |
-----------------
我需要按行查找最大值,这已经被问了很多次了,还有什么不同,此外,我还需要找到最大值的列的名称。结果必须是这样的:

--------------------
| K | C1 | C2 | C3 |
--------------------
| 1 | 14 | 24 | 48 |
| 2 | 10 | 65 | 37 | 
| 3 | 44 | 90 | 22 |
--------------------
-- how to get Col column?
-----------------
| K | Max | Col |
| 1 | 48  | C3  |
| 2 | 65  | C2  | 
| 3 | 90  | C2  |
-----------------

我学习了如何根据和线程查找最大行数,但我不理解如何在出现最大值的位置添加另一列,其中包含列的名称。我知道我必须表现出努力,但实际上我不能表现出任何东西,因为我只是不太明白如何去做,我所有的尝试都只是返回错误。有什么想法,提示吗?提前谢谢

SQL Server中最简单的方法是使用apply:


SQL Server中最简单的方法是使用apply:


我将通过将一个临时最大值表连接回原始表,然后编写一个长案例来解决这个问题,假设您有一个合理的列数。它将如下所示

Select a.K
, b.Max_Value
, Case When a.Column_1 = b.Max_Value Then C1
When a.Column_2 = b.Max_Value Then C2
When a.Column_3 = b.Max_Value Then C3
... As Col
From Your_Table as a Left Join Max_Table as b on a.K = b.K

如果我正确理解了这个问题,我相信这会让你得到你想要的。如果有很多列的长度太长,那么可能有更好的方法。

我会将临时最大值表连接回原始表,然后在有合理数量的列的情况下编写一个长案例来解决这个问题。它将如下所示

Select a.K
, b.Max_Value
, Case When a.Column_1 = b.Max_Value Then C1
When a.Column_2 = b.Max_Value Then C2
When a.Column_3 = b.Max_Value Then C3
... As Col
From Your_Table as a Left Join Max_Table as b on a.K = b.K

如果我正确理解了这个问题,我相信这会让你得到你想要的。如果您有很多列的时间过长,那么可能有更好的方法。

首先,感谢您的解决方案!它确实起作用了!但是,如果原始表中有两行具有最大值,该怎么办?例如,假设原始表中的1 | 48 | 24 | 48是什么?是否有办法在结果表中同时包含C1和C3行?为了在结果表中获得多条最大值记录,我只能去掉“top 1”和order by子句,然后对同一个表执行相关子查询,如…从不存在的表t1开始…从表t2开始,其中t2.val>t1.val,其中t1和t2是两次引用的同一个表。不管怎样,你的解决方案很好地满足了我的要求!再次感谢你!我不确定这是否对你有效,但可能需要一个小组来解决这个问题occurence@curveball . . . 子查询将选择带领带的top 1。首先,感谢您的解决方案!它确实起作用了!但是,如果原始表中有两行具有最大值,该怎么办?例如,假设原始表中的1 | 48 | 24 | 48是什么?是否有办法在结果表中同时包含C1和C3行?为了在结果表中获得多条最大值记录,我只能去掉“top 1”和order by子句,然后对同一个表执行相关子查询,如…从不存在的表t1开始…从表t2开始,其中t2.val>t1.val,其中t1和t2是两次引用的同一个表。不管怎样,你的解决方案很好地满足了我的要求!再次感谢你!我不确定这是否对你有效,但可能需要一个小组来解决这个问题occurence@curveball . . . 子查询将选择带领带的前1名。感谢您的参与和想法!是的,你是对的-有相当多的专栏和案例条款会太大。谢谢你的参与和想法!是的,您是对的-有很多列,case子句太大了。