2013-01-10 32 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