2013-03-05 103 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))