2017-01-03 6 views
1

私はクライアントタイプ履歴テーブルを持っています。実際に監査とクライアントのデータをまとめて見ていますが、tTypeHistoryと呼んでみましょう。また、クライアントIDでグループ化されませんでしたが、読みやすくするために努力していました。私はクライアントの種類がかなり容易に特定の日にあったものを見つけることができその日付範囲内にログインまたはログアウトした日付範囲内でアクティブなタイプを取得する

iClientID | IClientType | dEffectiveDate 
1   | 6   | 8/1/2016 
1   | 7   | 8/30/2016 
1   | 8   | 9/30/2016 
2   | 6   | 8/15/2016 
2   | 7   | 9/5/2016 
2   | 8   | 10/2/2016 
3   | 6   | 9/15/2016 
3   | 8   | 10/12/2016 

::私が今までクライアントタイプ7だった人を見つけることができます

SELECT TOP 1 iClientType 
FROM tTypeHistory 
WHERE iClientID = 1 dEffectiveDate <= '9/1/2016' 

ここ

は、いくつかの例のデータであり、しかし、私がやろうとしているのは、誰が範囲内で、通常は1ヶ月間のタイプ7であるかを特定することですが、特定の範囲になる可能性があります。

タイプ7では9/1-9/30の間で有効な日付を検索できましたが、クライアントID 2が見つかりましたが、クライアント1は見つかりませんでした。タイプ8 9/30の8日ですが、10/30などで変更されている可能性があります。

私は答えが分かりにくいはずがないと感じていますが、わかりません。

答えて

1

残念ながら、それはまるで正直ではありません。主な理由は、各行に有効日があり、終了日がないことです。問合せは、下記の終了日を割り出した後、希望iClientIDのを選択:

with cte 
AS 
(
    select *, 
    (select top 1 dEffectiveDate 
     from @TypeHistory t 
     where t.iClientID = t1.iClientID and t.dEffectiveDate > t1.dEffectiveDate 
     order by t.dEffectiveDate) as dEndDate 
    from @TypeHistory t1 
) 
select distinct iClientID 
    from cte 
where iClientType = 7 
    and ( dEffectiveDate between '9/1/2016' and '9/30/2016' 
     or dEndDate between '9/1/2016' and '9/30/2016' 
     or (dEndDate is null and dEffectiveDate < '9/1/2016')); 

EDITは:iClientTypeは、日付の範囲内で複数回変更したシナリオに対処するために「どこ」句を変更しました。

+0

私はまだ実際のデータに対していくつかのテストを行っていますが、それはあなたのように見えます!それは速かった!私のチームはこれを何時間も費やして無駄にしています。ありがとう!! – RobE

+0

特定のシナリオに対処するための 'where'節の変更に注意してください。 – wdosanjos

+0

ええ、私はそれが可能性のあるケースであると考えました。たとえば、誰かが9/15に7、その後9/16に他のものが登場しましたが、あなたの調整がそのようなケースをキャッチするように見えます。ありがとう! – RobE

関連する問題