0

レコードの有効な開始日と終了日を尊重しながら、同時に重複を見つけるための適切なクエリに苦労しています。以下のデータ例。

ClientName ClientID 有効開始 有効終了
A 1 1900-01-01 2100-01-01
A 1 1900-01-01 2100-01-01
B 2 1900-01-01 2012-05-01
C 2 2012-05-01 2100-01-01
D 3 1900-01-01 2012-05-01
E 3 2012-04-30 2100-01-01
F 4 2012-04-15 2100-01-01

私が探している出力は以下のとおりです。

クライアント名 クライアントID
1
D 3
E3

ロジックは、クライアント A の ID 1 が重複していることです。クライアント B と C には重複 (2) がありますが、2 つの重複が互いに重複しないように日付範囲が設定されているため、重複とは見なされません。クライアント D と E は ID 3 が重複しており、かつ日付範囲が重複しているため、重複と見なす必要があります。クライアント F には重複がないため、出力に表示されません。

何かご意見は?質問?

4

2 に答える 2

1

2つのバージョンがあります。Existsは単純ですが、参加するよりも遅い可能性があります。同じクライアントIDごとに重複するレコードがある場合、Existsは各レコードをチェックします。少なくとも1つ、それ自体を見つける必要があります。したがって、groupbyおよびhaingを使用します。

select distinct ClientName, ClientID
  from Table1
 where exists
 (
   select null
     from table1 test1
    where test1.clientid = table1.clientid
      and test1.EffectiveStart < table1.EffectiveEnd
      and test1.EffectiveEnd > table1.EffectiveStart
    group by test1.ClientID
   having count (*) > 1
 )

参加も同じですが、グループ化はすべてのレコードで行われるため、すべてのレコードをカウントする必要があります。

select test1.clientid
from table1 test1 
join table1 test2 on test1.clientid = test2.clientid
where test1.EffectiveStart < test2.EffectiveEnd 
  and test1.EffectiveEnd > test2.EffectiveStart
group by test1.clientid
having count (*) > (select count (*) 
                      from table1 
                     where clientid = test1.clientid)

ネストされたクエリを見たくないので、clientnameの取得を省略しました。

ライブテストはSqlFiddleで行われます。

于 2012-05-07T20:50:04.397 に答える
0

PKが必要になります

select c1.name, c2.name, c1.id
from client c1 
join client c2 on c1.id = c2.id and c1.PK < c2.PK
where c1.Start > c2.End or c1.End < c2.Start

2つの日付範囲が重複しているかどうかを判断 してください彼に+1を与えてください

于 2012-05-07T19:55:46.213 に答える