2013-08-01 56 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;