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
Какой самый элегантный способ получить то, что мне нужно?
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