2009-07-08 23 views
4

J'ai quelque chose comme la structure de données suivantes:groupe SQL min/max en question

 
Category StartDateTime  EndDateTime 
=============================================== 
1   12/1/2009 12:00  12/1/2009 12:12 
1   12/1/2009 04:00  12/1/2009 04:20 
2   12/2/2009 10:15  12/2/2009 10:22 
2   12/2/2009 11:00  12/2/2009 11:01 

Je veux que le min et max StartDateTime EndDateTime pour chaque catégorie. Comme ceci:

 
Category MinStartDateTime MaxEndDateTime 
=============================================== 
1   12/1/2009 12:00  12/1/2009 04:20 
2   12/2/2009 10:15  12/2/2009 11:01 

En utilisant min & max avec un groupe par catégorie ne semble pas fonctionner:

select 
    Category, 
    min(StartDateTime) [MinStartDateTime], 
    max(EndDateTime) [MaxDateTime] 
from 
    MyTable 
group by 
    Category 
order by 
    Category, 
    StartDateTime, 
    EndDateTime 

J'ai aussi essayé deux jointures internes sur une sous-requête pour chaque min et max déclaration , mais il semble exclure certains enregistrements:

select distinct 
    T1.Category, 
    T1.StartDateTime [MinStartDateTime], 
    T1.EndDateTime [MaxEndDateTime] 

from 
    MyTable T1 

inner join 
    (select 
     Category, 
     min(StartDateTime) [MinStartDateTime] 
    from 
     MyTable 
    group by 
     Category) T2 
on T2.Category = T1.Category and T2.MinStartDateTime = T1.StartDateTime 

inner join 
    (select 
     Category, 
     max(EndDateTime) [MaxEndDateTime] 
    from 
     MyTable 
    group by 
     Category) T3 
on T3.Category = T1.Category and T3.MaxEndDateTime = T1.EndDateTime 

order by 
    T1.Category, 
    T1.encodeStartDateTime, 
    T1.encodeEndDateTime 

Des idées? La base de données est Sybase ASE qui devrait être conforme à SQL-92.

Répondre

7

Votre première solution semble correcte à l'exception de la clause order by; essayez:

select 
    Category, 
    min(StartDateTime) [MinStartDateTime], 
    max(EndDateTime) [MaxDateTime] 
from MyTable 
group by 
    Category 
order by 
    Category, 
    MinStartDateTime, 
    MaxDateTime 
+0

me devança ...;) –

+4

Depuis la catégorie sera unique en vertu du groupement, il n'y a pas lieu d'ordonner (redondance) soit par le temps. –

+0

Oui, en utilisant les noms de champs corrects dans l'ordre en corrigeant les résultats. Je suis gêné par l'oubli. Merci d'avoir attiré mon attention! –