1

12月の間に不足しているギャップを見つけ、SQLクエリを使用してギャップを埋める必要があります

私はフォローインクエリを持っていますが、それはまだ正しくないので、tweekingが必要ですここに私が書いたものです

CREATE TABLE #BenfitDim(MemberName varchar(30),Memberkey int,MemberEffectiveDate DATETIME,
    MemberTerminationDate DATETIME)

INSERT INTO #BenfitDim VALUES('tom',231,'2012-11-18','2012-11-23')
INSERT INTO #BenfitDim VALUES('tom',231,'2012-11-24','2012-12-12')
INSERT INTO #BenfitDim VALUES('tom',231,'2013-01-01','2999-12-12')
INSERT INTO #BenfitDim VALUES('jack',344,'2011-06-27','2012-12-07') 
INSERT INTO #BenfitDim VALUES('jack',344,'2012-12-01','2015-12-31')
INSERT INTO #BenfitDim VALUES('nick',243,'2012-12-01','2012-12-07')
INSERT INTO #BenfitDim VALUES('joy',234,'2012-12-08','2012-12-14')
INSERT INTO #BenfitDim VALUES('tim',364,'2012-12-25','2012-12-30')
INSERT INTO #BenfitDim VALUES('tim',364,'2013-01-15','2013-01-30')
INSERT INTO #BenfitDim VALUES('jerry',365,'2011-9-15','2012-12-31')
INSERT INTO #BenfitDim VALUES('jerry',365,'2013-01-15','2013-01-30')
INSERT INTO #BenfitDim VALUES('jerry',365,'2011-01-15','2012-01-30')

SELECT MemberKey,
       MemberName,
       DATEADD(DAY,1,T1.MemberTerminationDate)AS MemberEffectiveDate,
       DATEADD(DAY,-1,D.MemberEffectiveDate)AS MemberTerminationDate
FROM
       #BenfitDim AS T1 CROSS APPLY(
                                SELECT MIN(MemberEffectiveDate)AS MemberEffectiveDate
                                  FROM #BenfitDim AS T
                                  WHERE T.MemberEffectiveDate > T1.MemberEffectiveDate 
                                  AND T.MemberKey = T1.MemberKey)D
 WHERE DATEADD(DAY,1,T1.MemberTerminationDate) <>  D.MemberEffectiveDate

実行すると、欠落しているシーケンスが見つかりますが、それでもわずかな問題があります。テーブル内の「ジャック」のオーバーラップデータを処理し、欠落しているシーケンスを正しく取得するにはどうすればよいですか。あなたの助けに感謝します。

4

1 に答える 1

0

以下のクエリはあなたが探していることをしていると思います。メンバーシップレコードごとに、次のメンバーシップを取得します。次のメンバーシップは翌日から開始されず、重複するメンバーシップはありません。

およびは、将来のすべてのレコードではなく、次のレコードの日付だけを取得する必要がありますMINGROUP BY

SELECT      T1.MemberKey,
            T1.MemberName,
            DATEADD(DAY,1,T1.MemberTerminationDate) AS MemberEffectiveDate,
            MIN(DATEADD(DAY,-1,T2.MemberEffectiveDate)) AS MemberTerminationDate

-- current membership
FROM        #BenfitDim AS T1

-- later membership
INNER JOIN  #BenfitDim AS T2                    
ON          T2.MemberKey = T1.MemberKey         
AND         T2.MemberEffectiveDate > T1.MemberTerminationDate

-- no membership following next day or overlapping
WHERE       NOT EXISTS (
            SELECT  T3.MemberEffectiveDate,
                    T3.MemberTerminationDate
            FROM    #BenfitDim AS T3
            WHERE   T3.Memberkey = T1.Memberkey
            AND     (T3.MemberEffectiveDate = DATEADD(DAY,1,T1.MemberTerminationDate)
            OR      T3.MemberEffectiveDate < T1.MemberEffectiveDate
            AND     T3.MemberTerminationDate > T1.MemberEffectiveDate))

GROUP BY    T1.MemberKey,
            T1.MemberName,
            T1.MemberTerminationDate
于 2013-01-30T11:03:15.727 に答える