2012-02-10 8 views
1

商品の購読のステータス更新を含むテーブルがあります。サブスクリプションが開始されるとレコードがテーブルに挿入され、そのレコードはサブスクリプションが終了すると終了日に更新されます。私たちのシステムの1つは、サブスクリプションを終了させて​​からもう一度(新しいレコードを作成する)「同日ドロップ\ add」することがあります。したがって、実際には何も変わっていないのに、同じサブスクライバIDが複数のレコードに添付されています。実際の開始日と終了日を保持しながら同じ日のドロップを除外追加

例のデータは、このようになります:

recID subID start   end  prodtype 
1  19 01/11/2001 01/15/2001 A 
2  19 01/15/2001 01/16/2001 A 
3  19 01/16/2001 01/20/2001 A 
4  19 01/30/2001 01/31/2001 A 

この男は1月11日に始まり、1月20日に終了しました。レコード2とレコード3はシステムによって入れられました(同じ日のドロップ加算ですが、実際はそうではありませんでした)。レコード4は、後で開始した19歳の別のサブスクリプションです。

個別のサブスクリプションの最初の(実際の)レコードのみを解決しようとするコードがありますが、サブスクライバがmax()およびグループ化を使用しないと実際の終了日を見つけることができません。もちろん、2つのサブスクリプション(1/11 - 1/31と1/30 - 1/31)が間違っています。

私はこのような二つのレコードにこのパターンを下に解決しようとする私の髪を引き裂くよ:

subID start   end  prodtype 
19 01/11/2001 01/20/2001 A 
19 01/30/2001 01/31/2001 A 

これは、Teradataのであるが、そのわずかANSI SQLは、私は信じています。

+0

予想結果ならびに正常以下の識別された1つを生成するウィンドウ集合関数を使用して、溶液があります。私に時間があれば、私もそれを書くようにします。 –

答えて

0

私はこれがANSI SQLだと思っていますが、SQL Serverでのみテストしました。

基本的に、クエリは、真に開始日と真の終了日を互いに独立して見つけることができます。次に、開始日と終了日を関連付けるために、開始日を開始日よりも大きい終了日に関連付けると、最小の終了日が表示されます。

SELECT 
    startDates.subId, 
    startDates.startDate, 
    MIN(endDates.endDate) AS endDate, 
    startDates.prodType 
FROM 
(
    SELECT 
     recID, subID, startDate, prodType 
    FROM yourTable s1 
    WHERE NOT EXISTS (
     SELECT 1 
     FROM yourTable s2 
     WHERE 
      s1.startDate = s2.endDate 
      AND s1.subId = s2.subId 
    ) 
) startDates JOIN 
(
    SELECT 
     recID, subID, endDate, prodType 
    FROM yourTable s1 
    WHERE NOT EXISTS (
     SELECT 1 
     FROM yourTable s2 
     WHERE 
      s1.endDate = s2.startDate 
      AND s1.subId = s2.subId 
    ) 
) endDates ON 
    startDates.subID = endDates.subID 
    AND startDates.startDate < endDates.endDate 
GROUP BY 
    startDates.subId, 
    startDates.startDate, 
    startDates.prodType 

Here is the query in action...

+0

これは素晴らしいです。どうもありがとうございます!!!私はそれが時間の合理的な時間(テーブルが巨大です)で実行できるようにタイムボックスにしなければならなかったので、私は研究開始日の後に開始または終了したレコードでフィーダーテーブルを作成し、私の研究開始日前に始まったようなものを整理しました。チャンピオンのように動作します! – user548084

0

次のようなコードで実際の終了日を持つすべてのレコードを見つけることができます:

select t1.* 
from myTable t1 left outer join myTable t2 on 
t1.SubID = t2.SubID and 
t1.end = t2.start and t2.start is null 

あなたはもちろん、同様の方法で記録を開始する見つけることができます。そして、それらを一緒にパッチすることができます。

つまり、すべての処理をあきらめ、ストアドプロシージャを使用するか、すべてのデータをクライアントに戻してそこで処理することがあります。

関連する問題