查找哪个COLUMN具有最大值(每行的值

时间:2013-06-20 08:56:05

标签: sql-server

MSSQL

表格如此

ID    1   | 2  |  3  |  4  |  5 
AA1   1   | 1  |  1  |  2  | 1

有关如何进行查询返回的任何线索

ID  |  MaxNo
AA1 | 4

,使用上表示例?我知道我可以在声明时写一个案例,但我觉得有一个更简单的方法来做这个

2 个答案:

答案 0 :(得分:3)

您可以使用UNPIVOT将这些可比项目正确地 1 添加到相同的列中,然后使用ROW_NUMBER()查找最高值的行 2

declare @t table (ID char(3) not null,[1] int not null,[2] int not null,
                 [3] int not null,[4] int not null,[5] int not null)
insert into @t (ID,[1],[2],[3],[4],[5]) values
('AA1',1,1,1,2,1)

;With Unpivoted as (
select *,ROW_NUMBER() OVER (ORDER BY Value desc) rn
from @t t UNPIVOT (Value FOR Col in ([1],[2],[3],[4],[5])) u
)
select * from Unpivoted where rn = 1

结果:

ID   Value       Col                       rn
---- ----------- ------------------------- --------------------
AA1  2           4                         1

1 如果您在同一个表中的多个列中出现来自同一“域”的数据(这样它甚至可以意义来比较这些值),那么通常是属性拆分的标志,其中部分数据被错误地用于构成列名称的一部分。

2 在你的问题中,你说“每行”,但你只给出了一行样本。如果我们假设ID值对于每一行都是唯一的,并且您想要为每个ID分别找到最大值,那么您可以将ROW_NUMBER()写为ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value desc) rn,得到(我希望)你正在寻找的结果。

答案 1 :(得分:2)

您可以在一行的列上使用交叉应用{。}}。

max()

如果您使用的是SQL Server 2005,则可以在派生表中使用select T1.ID, T2.Value from YourTable as T1 cross apply ( select max(T.Value) as Value from (values (T1.[1]), (T1.[2]), (T1.[3]), (T1.[4]), (T1.[5])) as T(Value) ) as T2 而不是union all

values()

SQL Fiddle