テーブルに「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 に答える