テーブルに「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 実行すると、欠落しているシーケンスが見つかりますが、テーブル内の「ジャック」のオーバーラップ データをどのように処理し、欠落しているシーケンスを正しく取得するかについて、若干の問題があります。
質問する
2966 次
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 に答える