2014-08-27 4 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

내가가 START_DATE의 매년 두 날짜 사이의 가장 큰 차이가있는 항목을 가지고 싶어를 : 주위를 얻는 방법의

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

답변

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

+0

감사합니다. @Bulat, 둘 다 매우 잘 작동합니다! 나는 이제 내가 내 별칭으로 잘못 가고있는 곳을 본다. 나는 조인을 사용하는 것에 아주 익숙하다. 그래서 당신의 도움에 감사한다! – Andy

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

관련 문제