2014-08-27 80 views
0

我已经查看了一些使用连接来获取组中最高值的示例,但我尝试的方法不喜欢使用内部连接之外的别名。在SQL内部连接中使用别名

SELECT f.year, f.name, f.date_start, f.date_end, f.max_year FROM ( SELECT EXTRACT(year FROM date_start) AS year, MAX(DATEDIFF(date_end,date_start)) AS max_year FROM mytable GROUP BY year ) AS x inner join mytable AS f on f.year = x.year and f.max_year = x.max_year;

所以,如果我有一个表:

Name date_start date_end John 1950-04-05 1960-07-08 Jack 1950-04-06 1960-12-31 Mark 1954-01-01 1970-01-01 Jane 1954-10-10 1978-10-01

然后,我希望它弹出有两个日期之间的最大差距的条目,每一年的起始日期为:

Year Name date_start date_end max_year 1950 Jack 1950-04-06 1960-12-31 3922 1954 Jane 1954-10-10 1978-10-01 8758

任何的如何解决建议 这个?

+0

当您运行查询或结果与预期不符时,是否收到错误消息? – Bulat 2014-08-27 15:45:31

回答

1

它看起来像你使用你的SELECT列表错误的别名,这应该是更好:

SELECT x.year, f.name, f.date_start, f.date_end, x.max_year FROM 
(
    SELECT 
     EXTRACT(year FROM date_start) AS year, 
     MAX(DATEDIFF(date_end,date_start)) AS max_year 
    FROM mytable GROUP BY year 
) AS x inner join 
mytable AS f on EXTRACT(year FROM f.date_start) = x.year 
AND DATEDIFF(f.date_end, f.date_start) = x.max_year; 

不过,我会做这样的:

SELECT name, date_start, date_end 
FROM mytable f 
WHERE NOT EXISTS (
    SELECT * FROM mytable 
    WHERE 
    EXTRACT(year FROM date_start) = EXTRACT(year FROM f.date_start) AND 
    DATEDIFF(date_end, date_start) > DATEDIFF(f.date_end, f.date_start) 
) 
+0

http://sqlfiddle.com/#!2/4d0da/13 – Bulat 2014-08-27 16:05:05

+0

谢谢@Bulat,两人工作得非常好!我现在看到我的别名出错了。我很喜欢使用连接,所以感谢您的帮助! – Andy 2014-08-27 22:42:18

1

你可以用这个试试:

SELECT * FROM 
(
    SELECT *, EXTRACT(year FROM date_start) AS year, DATEDIFF(date_end,date_start) AS diff 
    FROM mytable 
    ORDER BY diff DESC 
) sq 
GROUP BY year 
ORDER BY year ASC 

小提琴演示:http://sqlfiddle.com/#!2/4d0da/11

+0

+1工作解决方案,但它是MySQL黑客,所以我不会推荐使用它。 – Bulat 2014-08-27 16:11:11