Search code examples
sqlgroup-bysql-server-2000maxcoalesce

SQL - Ugly combination of GROUP BY and COALESCE


I have a table with data similar to the following:

[ID], [State], [foo], [DateCreated], [DateUpdated]

The longer I work on this, the uglier my SQL is getting, which tells me I'm probably doing something wrong. What I want is a unique list of each State so long as foo is always the same for that State (if foo is not the same for all records in that State, I don't want that State at all). Also, I want to COALESCE DateCreated and DateUpdated and want the maximum value for that State.

So given this data:

[ID], [State], [foo], [DateCreated], [DateUpdated]
1,  MA, data1,  05/29/2012, 06/02/2012
2,  MA, data1,  05/29/2012, 06/03/2012
3,  RI, data2,  05/29/2012, NULL
4,  RI, data3,  05/29/2012, NULL
5,  NH, data4,  05/29/2012, NULL
6,  NH, data4,  05/29/2012, 06/05/2012

I'd like only these results:

[State], [foo], [LastUpdated]
MA, data1,  06/03/2012
NH, data4,  06/05/2012

What's the most elegant way to get what I'm after?


Solution

  • A simple Group by with nested queries should suffice:

    Select State, coalesce(max_created,max_updated) from (
      Select State, min(foo) as min_foo, max(foo) as max_foo, 
        max(DateCreated) as max_created,
        max(DateUpdated) as max_updated
      From Data
      Group by State)
     Where min_foo = max_foo