1

私は次のようなテーブルを持っています

╔══════╦══════╦═══════╦═══════╦═══════╦═══════════════════╗
║ Key1 ║ Key2 ║ Data1 ║ Data2 ║ Data3 ║ DataNotImportant4 ║
╠══════╬══════╬═══════╬═══════╬═══════╬═══════════════════╣
║ Foo  ║ Bar  ║     1 ║     2 ║     a ║                 4 ║
║ Foo  ║ Bar  ║     1 ║     2 ║     a ║                 5 ║
║ Foo  ║ Bar  ║     1 ║     2 ║     b ║                 4 ║
║ Foo  ║ Test ║     1 ║     2 ║     f ║                 4 ║
╚══════╩══════╩═══════╩═══════╩═══════╩═══════════════════╝

ここで、Data1 Data2 Data3が異なるKey1とKey2の組み合わせを選択します。したがって、Data3はすべての行で同じではないため、結果としてFooBarを取得します。カーソルなしでこれをアーカイブするにはどうすればよいですか?データベースはSQLServer2008です

現在、カーソルを使用しています。group byを使用してすべてのキーの組み合わせを選択し、リストを繰り返し処理して、カーソルから取得したキーを使用してフィールドを選択してグループを作成します。問題は、行が多すぎると実際に遅くなることです。そこで、セットベースのソリューションを探します。

4

2 に答える 2

4

式を使用しgroup by、1つの列に異なる値がある場合、その列の最小値と最大値が異なることを意味する必要があるという事実に依存します。

declare @t table (key1 varchar(5),key2 varchar(5),Data1 int,Data2 int,Data3 int)
insert into @t (key1,key2,Data1,Data2,Data3) values
('Foo','Bar',1,2,3),
('Foo','Bar',1,2,3),
('Foo','Bar',1,2,4),
('Foo','Test',1,2,3)

select key1,key2 from @t
group by key1,key2
having
    MIN(data1)!=MAX(data1) or
    MIN(data2)!=MAX(data2) or
    MIN(data3)!=MAX(data3)

結果:

key1  key2
----- -----
Foo   Bar
于 2013-02-01T07:59:37.927 に答える
1

Group By複数の列で使用できます。

SELECT Key1=Min(f.key1), 
       Key2=Min(f.key2), 
       f.data1, 
       f.data2, 
       f.data3, 
       DataNotImportant4=Min(datanotimportant4) 
FROM   foo f 
GROUP  BY f.data1, 
          f.data2, 
          f.data3 
HAVING Count(*) > 1 

デモ

于 2013-02-01T08:04:47.970 に答える