SQL-уродливая комбинация GROUP BY и COALESCE



У меня есть таблица с данными, похожими на следующие:



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



Чем дольше я работаю над этим, тем уродливее становится мой SQL, что говорит мне, что я, вероятно, делаю что-то неправильно. Мне нужен уникальный список каждого состояния, если foo всегда одинакова для этого состояния (Если foo не одинакова для всех записей в этом состоянии, я вообще не хочу этого состояния). Кроме того, я хочу объединить DateCreated и DateUpdated и хочу, чтобы максимальное значение для этого состояния.



Итак, учитывая эти данные:



[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


Я хотел бы получить только следующие результаты:



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


Какой самый элегантный способ получить то, что мне нужно?

678   5  

5 ответов:

Достаточно простой группы by с вложенными запросами:

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

Еще один:

Http://sqlfiddle.com/#!6 / fd219/1

SELECT
  t.State,
  MAX(t.foo),
  MAX( COALESCE( t.DateUpdated, t.DateCreated ))
FROM t
GROUP BY t.State
HAVING COUNT(DISTINCT t.foo) = 1;

Не так элегантно, но для вас, бедных душ SQL 2000:

SELECT T1.State, T2.Foo, T1.LastUpdated
FROM (
    SELECT State, MAX([ID]) AS [ID], 
        MAX(COALESCE(DateUpdated, DateCreated)) AS LastUpdated
    FROM YourTable
    GROUP BY State
    HAVING COUNT(DISTINCT Foo) = 1
) T1 
INNER JOIN YourTable T2 ON T1.State = T2.State AND T1.[ID] = T2.[ID]

Предполагая, что вы используете SQL Server 2005 или >

Попробуйте это:

WITH Data AS
(
    SELECT  *,
        COALESCE([DateCreated], [DateUpdated]) AS LastUpdated,
        ROW_NUMBER() OVER(PARTITION BY State ORDER BY COALESCE([DateCreated], [DateUpdated]) DESC) Position
      FROM <YOUR-TABLE> a
     WHERE NOT EXISTS
     (
        SELECT  1 
            FROM    <YOUR-TABLE> b
         WHERE  a.State = b.State
            AND a.foo <> b.foo
     )
)
SELECT State, foo, LastUpdated
  FROM Data
 WHERE Positon = 1

Попробуйте это:

select state_name,foo,max(dateUpdated) from state where state_name in (select state_name from state group by state_name having count(distinct foo)=1) group by state_name,foo;

Comments

    Ничего не найдено.