1

製品へのサブスクリプションのステータス更新を示す表があります。サブスクリプションの開始時にレコードがテーブルに挿入され、サブスクリプションの終了時にそのレコードが終了日で更新されます。私たちのシステムの 1 つ (どのシステムかはわかりません) は、サブスクリプションを終了してから再び開始する (新しいレコードを作成する) 「同日ドロップ/追加」を行うことがあります。そのため、実際には何も変更されていないにもかかわらず、同じ購読者 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() を使用してサブスクライバーごとにグループ化しないと、実際の終了日を見つけることができません。もちろん、1/11 - 1/31 と 1/30 - 1/31 の 2 つのサブスクリプションが表示されますが、これは誤りです。

このパターンを次のような 2 つのレコードに解決しようとして、私は頭を悩ませています。

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

これは Teradata にありますが、単なる ANSI SQL だと思います。

4

2 に答える 2

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

これが実際のクエリです...

于 2012-02-10T20:58:10.187 に答える
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

もちろん、同様の方法で開始レコードを見つけることができます。次に、それらを一緒にパッチすることができます。

そうは言っても、すべての処理を select ステートメントで行うことをあきらめてストアド プロシージャを使用するか、すべてのデータをクライアントに戻してそこで処理する場合があります。

于 2012-02-10T20:34:37.970 に答える