6

次のようなデータのテーブルがあります。

[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

私が求めているものを手に入れるための最もエレガントな方法は何ですか?

4

5 に答える 5

10

別のもの:

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;
于 2012-07-10T17:52:43.413 に答える
5

ネストされたクエリを使用した単純な Group 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
于 2012-07-10T17:57:19.667 に答える
3

それほどエレガントではありませんが、SQL2000の貧弱な人々にとっては次のようになります。

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]
于 2012-07-10T17:57:06.377 に答える
1

SQLServer2005または>を使用していると仮定します。

これを試して:

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
于 2012-07-10T17:48:39.503 に答える