2013-08-01 57 views
1

我的表有三列[ID], [YEAR], [MALES],对于任何给定的ID,在多个YEAR值上可以有多个MALES值。SQL - 给定查询MAX值不同列的最大值

EX。

[ID]  [YEAR]  [MALES] 
1  2010  10 
1  2011  20 
1  2011  35 
1  2011  0 
1  2012  25 
1  2012  10 
2  2010  5 
2  2011  2 
2  2011  11 
2  2011  12 
2  2012  0 
2  2012  10 

我需要为每个ID查询该年的最大YEAR和最大MALES值。因此,对于例如上述结果将是:

[ID]  [YEAR]  [MALES] 
1  2012  25 
2  2012  10 
+0

将所有编号的具有相同的'MAX(年)'? –

+0

编号MAX(年)可以在不同ID之间变化。 – cvdellen

回答

2

你要做到这一点使用row_number()

select id, year, males 
from (select t.*, 
      row_number() over (partition by id 
           order by years desc, males desc 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

我真的很好奇,看到这个答案和我之间的解释计划的差异...一些测试的时间... –

+0

谢谢,这正是我所需要的。作为后续,是否有一种方法可以将过滤器应用于row_number()over(partition ...语句)?例如,我想忽略[males] = 0的所有数据。 – cvdellen

+0

@cvdellen ...。You可以在子查询中添加一个where子句,但请记住排序是递减的,因此,筛选出0会导致最近一年被筛选出来,如果唯一值为'0'。 –

0
;with CTE as 
(
    select 
     *, 
     row_number() over (partition by ID order by year desc, males desc) as row_num 
    from table 
) 
select * 
from CTE 
where row_num = 1 

;with CTE as 
(
    select ID, max(Year) as Year 
    from table 
    group by ID 
) 
select t.ID, t.Year, max(males) as males 
from table as t 
    inner join CTE as c on c.ID = t.ID and c.Year = t.Year 
group by t.ID, t.year 
+0

请解释为什么downvote? –

0

你需要使用一个子查询以获得最大年份,然后加入以获得当年的最大MALES。

SELECT T.ID 
     ,SQ.MAX_YEAR 
     ,MAX(T.MALES) 
FROM TABLE1 T 
INNER JOIN 
     (
     SELECT ID 
       ,MAX(YEAR) AS MAX_YEAR 
     FROM TABLE1 
     GROUP BY 
       ID 
     ) SQ 
ON  T.ID = SQ.ID 
AND  T.YEAR = SQ.MAX_YEAR 
GROUP BY 
     T.ID 
     ,SQ.MAX_YEAR 
0

如果我知道你想什么(你的措辞是有些困难,但例如使它看起来像你想我的第二个)。

每个ID最多年份:

SELECT id, MAX(year) FROM data; 

最大的一年每个ID最多男性:

SELECT id, year, MAX(males) FROM data WHERE year = (SELECT MAX(year) FROM data) 
    GROUP BY id;