2014-08-27 11 views
0

J'ai examiné quelques exemples d'utilisation de jointures pour obtenir la valeur la plus élevée dans un groupe, mais les méthodes que j'ai essayées n'aiment pas l'utilisation d'alias en dehors de la jointure interne .Utilisation d'alias dans la jointure interne 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;

Donc, si j'ai une table:

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

Alors je le veux pour afficher les entrées qui ont le plus grand écart entre les deux dates, pour chaque année de la 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

Toutes les suggestions sur la façon de se déplacer ce?

+0

Avez-vous une erreur lorsque vous exécutez votre requête ou que les résultats ne correspondent pas aux attentes? – Bulat

Répondre

1

Il semble que vous utilisez mal alias dans votre liste SELECT, cela devrait être mieux:

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; 

Cependant, je le ferais comme ceci:

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

Merci @Bulat, les deux fonctionnent très bien! Je vois maintenant où je me trompais avec mes alias. Je suis assez novice dans l'utilisation des jointures, alors merci pour votre aide! – Andy

1

Vous pouvez essayer cette :

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 

Fiddle demo: http://sqlfiddle.com/#!2/4d0da/11

+0

+1 pour la solution de travail, mais il est bidouille mysql donc je ne recommanderais pas de l'utiliser. – Bulat