MSSQL
表格如此
ID 1 | 2 | 3 | 4 | 5
AA1 1 | 1 | 1 | 2 | 1
有关如何进行查询返回的任何线索
ID | MaxNo
AA1 | 4
,使用上表示例?我知道我可以在声明时写一个案例,但我觉得有一个更简单的方法来做这个
答案 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()