2009-10-20 8 views
2

J'ai un besoin où je dois générer un rapport sur les projets logiciels en cours. Deux des colonnes sont la date du dernier jalon et la date du jalon précédent. De toute évidence, les jalons sont stockés dans une table de transaction afin que nous puissions avoir plusieurs jalons par projet.Sélection de transactions en une seule ligne

J'ai eu ici jusqu'à présent, mais maintenant je vais avoir des questions:

select proj.* 
from zsof_projects proj 
join zsof_milestones current_milestone on current_milestone.product_id = proj.id 
join zsof_milestones last_milestone on last_milestone.product_id = proj.id 
join (
     select product_id, max(actual_date) maxDate 
     from zsof_milestones 
     group by product_id 
     ) a on a.product_id = current_milestone.product_id and a.maxDate = current_milestone.actual_date 
join (
     select mile.product_id, max(actual_date) maxDate 
     from zsof_milestones mile 
     join (
       select product_id, max(actual_date) maxDate 
       from zsof_milestones 
       group by product_id 
       ) a on a.product_id = mile.product_id and mile.actual_date < a.maxDate 
     group by mile.product_id 
     ) b on b.product_id = last_milestone.product_id and b.maxDate = last_milestone.actual_date 
order by proj.id; 

Le problème que j'ai est que tous les projets auront une dernière étape et tous les projets auront plus de un jalon. J'ai essayé les jointures à gauche mais ensuite je récupère plusieurs rangées par projet (ce que je dois éviter). J'utilise Oracle 10, donc s'il y a quelque chose que je peux utiliser en PL/SQL, je le prendrai aussi.

Répondre

4

utilisation de Google Analytics :)

SELECT v.* 
    FROM (SELECT proj.*, actual_date, 
       MAX(actual_date) over(PARTITION BY ms.product_id) last_milestone, 
       lag(actual_date) over(PARTITION BY ms.product_id 
            ORDER BY actual_date) previous_milestone 
      FROM zsof_projects proj 
      LEFT JOIN zsof_milestones ms ON ms.product_id = proj.id) v 
WHERE last_milestone = actual_date 
    OR (actual_date IS NULL AND last_milestone IS NULL) 

Mise à jour: Je transformé en JOIN LEFT JOIN dans le cas où un projet ne dispose pas d'une étape importante.

+0

Merci! Cela fonctionne très bien. Je n'ai pas vu certaines des fonctions que vous avez utilisées ici, donc j'ai l'air d'avoir quelques lectures à faire. –

Questions connexes