tags:

views:

902

answers:

2

I have something like the following data structure:

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

I want the min StartDateTime and max EndDateTime for each Category. Like this:

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

Using min & max with a group by Category doesn't seem to work:

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

I also tried two inner joins on a sub-query for each min and max statement, however it seems to be excluding some records:

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

Any ideas? The database is Sybase ASE which should be SQL-92 compliant.

+7  A: 

Your first solution looks correct except for the order by clause; try:

select
    Category,
    min(StartDateTime) [MinStartDateTime],
    max(EndDateTime) [MaxDateTime]
from MyTable
group by
    Category
order by
    Category,
    MinStartDateTime,
    MaxDateTime
joeslice
Beat me to it... ;)
David M
Since the Category will be unique by virtue of the grouping, there is no need to order (redundantly) by either time.
Jonathan Leffler
Yes, using the correct field names in the order by corrected the results. I'm embarrassed by the oversight. Thanks for brining it to my attention!
Edward Stembler
Or you could have ordered the result set by the ordinal number of the column (ORDER BY 1, 2, 3).
Eugene
+1  A: 

At first glance, your first SQL query looks OK without the ORDER BY clause. Does it work without that?

David M