MSSQL查找其中列有每行一個最大(值
表看起來像這樣
ID 1 | 2 | 3 | 4 | 5
AA1 1 | 1 | 1 | 2 | 1
我如何可以做一個查詢任何線索返回
ID | MaxNo
AA1 | 4
,usign的上面的表格舉例?我知道我可以在發表聲明時寫一個case blah,但我有一種感覺,有這樣一種更簡單的方法:
MSSQL查找其中列有每行一個最大(值
表看起來像這樣
ID 1 | 2 | 3 | 4 | 5
AA1 1 | 1 | 1 | 2 | 1
我如何可以做一個查詢任何線索返回
ID | MaxNo
AA1 | 4
,usign的上面的表格舉例?我知道我可以在發表聲明時寫一個case blah,但我有一種感覺,有這樣一種更簡單的方法:
可以使用UNPIVOT
得到這些可比項目,正確,到同列,然後用ROW_NUMBER()
找到價值最高的行:
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
如果您有山姆的數據e「域」出現在同一個表中的多列中(因此它甚至使感知來比較這些值),它通常是屬性拆分的標誌,其中部分數據錯誤地用於形成一列名稱。
在你的問題中,你說「每行」,但你只給了一行樣本。如果我們假設ID
值對於每一行都是唯一的,並且您希望分別爲每個ID
找到最大值,那麼您會編寫ROW_NUMBER()
作爲ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value desc) rn
,以獲得(我希望)您正在查找的結果。
對於一行的列,您可以使用跨應用max()
。
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
如果你是SQL Server 2005上,你可以在派生表中使用union all
,而不是values()
。
select T1.ID,
T2.Value
from YourTable as T1
cross apply
(
select max(T.Value) as Value
from (select T1.[1] union all
select T1.[2] union all
select T1.[3] union all
select T1.[4] union all
select T1.[5]) as T(Value)
) as T2
能否請您詳細多了,我不明白你的問題很好。我的意思是你想輸出作爲MaxNo ID - >你的意思是把它作爲5和AA1作爲4,我的意思是什麼是計算.. ?? –
他想知道哪列包含每條記錄的最大數量。他的輸出是記錄的ID(行 - AA1),並且包含最大數量(第四列)的列。 –
@RaduGheorghiu這是正確的,我想不出更好的解釋方式,你能幫忙嗎? – Waller