1
テーブルに「BenefitKey、MemberKey、StartDate、Enddate」の 4 つの列があります

次のようなデータが与えられた場合:

    開始日 終了日
    ------------------------------
    20110315 20110316
    20110317 20110320
    20110321 20110325
    20110326 20121202
    20121203 20121210
    20121211 20121215
    20121225 20121231

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

ここで欠落しているギャップは、`20121216` から `20121224` までです。私はこのような1000行を持っているので、SQLクエリが必要です.私はそれに対するいくつかの解決策を見つけましたが、それでもここで私が書いたものは正しくありません
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('喜び',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')




    メンバーキーを選択し、
           メンバー名、
           DATEADD(DAY,1,T1.MemberTerminationDate)AS MemberEffectiveDate,
           DATEADD(DAY,-1,D.MemberEffectiveDate)AS MemberTerminationDate
    から
           #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

4 に答える 4

0

データが重複のないこの形式である場合、次のクエリで2つの日付間のギャップが取得されます。

select enddate+1 as startdate,
       (select MIN(startdate) - 1 from t t2 where t2.startdate > t.enddate
       ) as enddate
from t
where enddate+1 not in (select startdate from t)

私の意見では、クエリの構造がより明確になるため、ここでは相関サブクエリを使用しています。ギャップはenddate+1、次の開始日の1日前に開始および終了します。そして、enddate+1それ自体が開始日でない場合にのみギャップがあります。

これで正しい結果が得られる場合は、次を使用してこれらの値をテーブルに挿入できます。

insert into t(startdate, enddate)
    select enddate+1 as startdate,
           (select MIN(startdate) - 1 from t t2 where t2.startdate > t.enddate
           ) as enddate
    from t
    where enddate+1 not in (select startdate from t)
于 2013-01-28T16:49:09.963 に答える
0

あなたがしたいのは、前のレコードに参加している自己結合です。次のようなものです。

SELECT …,startDate, endDate
  FROM Table t, Table t2
 WHERE t2.id=t1.id+1

(これは、ID がシーケンシャルであることを前提としています。そうでない場合は、次のようにします。

 WHERE t1.enddate < MIN(t1.startdate)

これにより、日付順に次のレコードが取得されます。

次に、穴を塞ぐのは簡単なことです。

INSERT INTO table
   VALUES blah, blah, t.endDate+1, t2.startDate-1

(日付の疑似コード。DATEADD など、バージョンがサポートする関数を使用して計算を行う必要があります。)

于 2013-01-28T15:59:18.790 に答える
0

テーブルの名前が「Benefits」だとします。

この線に沿った何かがあなたの問題を解決しますか?

SELECT A.EndDate + 1 AS GapFrom,
    (SELECT MIN(StartDate) - 1 
     FROM Benefits WHERE StartDate > A.EndDate) AS GapUntil
FROM Benefits A
LEFT JOIN Benefits B WHERE A.EndDate + 1 = B.StartDate
WHERE B.BenefitKey IS NULL
于 2013-01-28T15:57:44.873 に答える
0

完全な年の日付を含むテーブルはありますか? そうでない場合は、欠落している日付を見つけるために作成する必要があります。それ以外の場合は、非常に遅いカーソルを使用できます。

于 2013-01-28T15:52:55.067 に答える