2013-01-10 81 views
28

我試圖選擇兩列到表(ID和狀態)。該表應顯示每個ID具有最大值的狀態。我試了幾個其他的例子,但似乎沒有任何工作。選擇列值,其他列是組的最大值

原始數據結構:

ID state value (FLOAT) 
1 TX 921,294,481 
1 SC 21,417,296 
1 FL 1,378,132,290 
1 AL 132,556,895 
1 NC 288,176 
1 GA 1,270,986,631 
2 FL 551,374,452 
2 LA 236,645,530 
2 MS 2,524,536,050 
2 AL 4,128,682,333 
2 FL 1,503,991,028 

所得到的數據結構,因此應該是這樣的:

ID STATE (Max Value) 
1 FL 
2 AL 

佛羅里達州和阿拉巴馬州在他們的ID組的最大價值。

任何幫助將不勝感激這一點。我確實已經找到了答案here,但無法讓答案對我有用。

+0

所以你也使用'SQL-Server',如果是的話,哪個版本? 'value'是一個'varchar'? –

+0

值是用逗號分隔的嗎? –

回答

34

對於SQL Server(和其他產品用窗函數):

SELECT * 
FROM 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY value desc) as rn 
    FROM 
    UnnamedTable 
) t 
WHERE 
    t.rn = 1 
+0

謝謝先生。 Jacco的其他解決方案也可以工作,並且是一個很好的答案。 –

6

的溶液,基於這樣的假設value是數字:

SELECT 
    [ID], 
    [State], 
    [Value] 
FROM 
(
    SELECT 
    [ID], 
    [State], 
    [Value], 
    Rank() OVER (PARTITION BY [ID] ORDER BY [Value] DESC) AS [Rank] 
    FROM [t1] 
) AS [sub] 
WHERE [sub].[Rank] = 1 
ORDER BY 
    [ID] ASC, 
    [State] ASC 

如果多個State s的相同ID有相同的Value,他們都會得到相同的Rank。這與使用Row_Number不同,後者返回唯一的行號,但順序是任意選擇的。 (參見:SQL RANK() versus ROW_NUMBER()

5

您可以使用子查詢來得到這樣的結果:

select t1.id, t1.[state] MaxValue 
from yourtable t1 
inner join 
(
    select id, max(value) MaxVal 
    from yourtable 
    group by id 
) t2 
    on t1.id = t2.id 
    and t1.value = t2.maxval 
order by t1.id 

SQL Fiddle with Demo