2013-03-05 107 views
4

我這裏有尋找一年差的最大值

BIODATA 
ID     NAME 
1      A 
2      B 

YEAR 
ID     JOIN YEAR   GRADUATE YEAR 
1      1990     1991 
2      1990     1993 

兩個表我已經使用

select 
    NAME, 
    max(year(JOIN_YEAR) - year(GRADUATE_YEAR)) as MAX 
from 
    DATA_DIRI 
right join DATA_KARTU 
    ON BIODATA.ID = YEAR.ID; 

但結果卻變成了:

+--------+------+ 
| NAME | MAX | 
+--------+------+ 
| A  | 3 | 
+--------+------+ 

我已經嘗試了很多的不同類型的連接,但我仍然無法找到NAME如何成爲「B」。任何人都可以幫助我?非常感謝

+0

您只給出兩個表的數據,您應該從您的問題中刪除額外的表或爲它們添加數據另外,我會建議使用Sqlfiddle作爲提供數據和結構的一種方式。我開始使用您在http://sqlfiddle.com/#!6/463d8/7提供的數據。但最重要的是,你需要提供一個理由說明爲什麼你想要B而不是A.爲什麼不是兩個? – jmoreno 2013-03-05 06:56:21

+0

列加入和研究生年的數據類型是什麼? – 2013-03-05 07:22:35

回答

2

如果您一次使用選擇集中的集合和非集合,那麼用於非集合字段的行本質上是隨機選取的。

基本上,max的工作原理是這樣的 - 它通過查詢(如果沒有group by,所有這些查詢)收集每個組的所有行,計算max並將其放入結果中。

但是,既然您也放入了一個非聚集字段,它需要一個值 - 所以SQL所做的只是隨機選擇一行。你可能會想'爲什麼不選擇最大的那一行呢?'但是如果你使用平均數或計數呢?這些沒有與它相關聯的行,所以它能做的最好的是隨機挑選。這就是爲什麼這種行爲通常存在。

你需要做的是使用子查詢。類似select d1.id from data_diri d1 where d1.graduate_year - d1.join_year = (select max(d2.graduate_year - d2.join_year from data_diri d2))