2011-06-20 71 views
0

我有一個包含以下字段和數據的表。在mysql查詢中查找多行的最大列數

RefNo Year Month Code 
1  2010 7  A 
2  2009 10 B 
3  2010 8  A 
4  2010 5  B 

從這我要找出一個特定的代碼的最大(年,月)。 結果必須是

3 2010 8 A 
1 2010 7 B 

請幫我解決這個問題。

+0

你想爲每個'Code'做到這一點? – wlk

回答

0

說你的表名是 「table1的」,那麼

select * from 
(select * from table1 where Year in (select max(Year) from table1)) abc 
where Month not in (select min(Month) from abc) 
1

這是否對你的工作?這個想法是將Year和Month組合成SQL可以接受MAX的東西,然後將表加入到它自己的修改版本中。

SELECT OriginalTable.RefNo, OriginalTable.Year, OriginalTable.Month, OriginalTable.Code 
FROM table OriginalTable, 
    (SELECT Code, MAX(Year*100 + Month) AS CombinedDate 
     FROM table 
     GROUP BY Code) AS MaximumResults 
WHERE OriginalTable.Code = MaximumResults.Code 
AND OriginalTable.Year = MaximumResults.CombinedDate/100 
AND OriginalTable.Month = MaximumResults.CombinedDate % 100 

的想法是解釋更徹底這裏:http://www.techonthenet.com/sql/max.php

+0

不錯。我想你忘記爲'CombinedDate'添加條件了(它也必須參加加入,我明白了)。另外,爲什麼不使用當前標準的語法進行連接?你的過時,即使它正在工作。我的意思是,畢竟,你爲別人提供瞭解決方案。 –

+0

哦,我的,你是對的 - 這裏有各種各樣的問題。無論如何,謝謝你的建設性批評。我很喜歡這個地方! –

2
SELECT 
    * 
FROM 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY Code ORDER BY Year DESC, Month DESC) AS row_number, 
    * 
    FROM 
    myTable 
) 
    AS orderedTable 
WHERE 
    row_number = 1 


編輯現在對於在MySQL WORKS版本...

SELECT 
    * 
FROM 
    myTable 
WHERE 
    Year * 12 + Month = (SELECT MAX(Year * 12 + Month) FROM myTable AS lookup WHERE Code = myTable.Code) 

編輯訪問SQL後,可以確認這是更快...

WHERE 
    Year = (SELECT MAX(Year) FROM myTable AS lookup WHERE Code = myTable.Code) 
AND Month = (SELECT MAX(Month) FROM myTable AS lookup WHERE Code = myTable.Code AND Year = myTable.Year) 
+1

這將有可能在MySQL的某一天工作。 –

+0

+1:'* facepalm *' – MatBailie

0

我已經得到了解決:

Select Month(B.NewDate) Mon, Year(B.NewDate) Year, Code, PK 
from T1 A , 
(Select Max(Str_To_Date(Concat('01',',',Month,',',Year), '%d,%m,%Y')) as NewDate, Code C 
from T1 group by Code) B 
Where PK = (Select PK from T1 
       where Year = Year(B.NewDate) and Month = Month(B.NewDate) and Code = A.Code) 
and A.Code = C 
group by Code