2016-03-21 15 views
0

私は日付フィールド、人の名前と一意の識別子を持つSQL Serverテーブルを持っています。日付はすべて2015年以内で、週末の日付です。たとえば2015-12-05、2015-12-12などです。私は少なくとも3ヶ月のデータのギャップを持つ固有の識別子のリストを見つける必要があります。月間のギャップを見つける

したがって、ユニークな識別子Aのエントリが2015-12-12と2015-07-25の場合、結果に表示されます。エントリがより一貫している場合は、1か月に1週間と言いますが、私は結果でそれを見たくありません。私はすべての一意の識別子を2015年のどこかに3ヶ月のギャップで表示する必要があります。

どこから始めたらいいのか分かりません。何か案は?

+0

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+1

存在しない場所は良い考えです。 –

+0

行単位または人単位で一意の識別子ですか?テーブル構造を投稿してください(テーブルの 'CREATE'文で十分です)。 – Ruslan

答えて

0

私がランク機能を使用して終了し、テーブルの上に各識別子のために存在していたヶ月位。例えば、

select identifier,month,RANK() OVER (PARTITION BY identifier ORDER BY month) rnk 

table1

私はその後、一時テーブルには、このクエリからすべてのデータをアップロードしました。その後、先行行と次の行月を引き出すために先導関数と遅れ関数を使用しました。 すべてのデータが正しく注文されていることを確認してください。私もそれを一時テーブルに挿入しました。

select identifier,rnk,lag(month) over (order by identifier) PreviousMonth,month,lead(month) over (order by identifier) NextMonth from #table group by identifier,month,rnk 

次に、ギャップが3ヶ月以上ある場所を示すために一時テーブルを照会しました。

select identifier, PreviousMonth,NextMonth,Month-PreviousMonth as Month_Gap from #table2 where month-PreviousMonth >0 and month-PreviousMonth >=3 and rnk>1 

これは役立ちます。 私の最終的な出力は次のようなものになりました。

table2

0

あなたはこれについてどう思いますか:

ANSI 89

SELECT t1.* from 
your_table as t1,your_table as t2 
where DATEDIFF(month,t1.your_date_field,t2.your_date_field) >= 3 and 
t1.your_unique_id=t2.your_unique_id and 
not exists(
    select 1 
    from your_table as t3 
    where t3.your_unique_id = t1.your_unique_id and 
    DATEDIFF(month,t1.your_date_field,t3.your_date_field) < 3 
) 

ANSI 92

SELECT t1.* from 
your_table as t1 
    inner join your_table as t2 on t1.your_unique_id=t2.your_unique_id 
where DATEDIFF(month,t1.your_date_field,t2.your_date_field) >= 3 and 
not exists(
    select 1 
    from your_table as t3 
    where t3.your_unique_id = t1.your_unique_id and 
    DATEDIFF(month,t1.your_date_field,t3.your_date_field) < 3 
) 

あなたはより詳細な説明が必要ですか?

+0

t1とt2は同じテーブルで結合されていますか? –

+0

両方とも "your_table"と "yes"と呼ばれるので... –

+0

これは実際には機能しません。毎月6か月間のエントリーがあった場合、これはまだいくつかの結果を返します。また、古いANSI-89スタイルの結合も使用しています。 –

0

私はこのような適用に使用することをお勧めしたい:

SELECT DISTINCT t1.id FROM <table> t1 
    CROSS APPLY (SELECT TOP 1 t.date FROM <table> t 
     WHERE t.id = t1.id AND t.date < t1.date ORDER BY t.date DESC) t2 
WHERE DATEDIFF(month, t1.date, t2.date) >= 3 
関連する問題