2017-08-08 3 views
1

最初のレコードが作成された後に特定のレコード(この場合は「下位」が作成されているかどうか)をチェックし、 「下」またはnull。SQL - 別のレコードの後に​​レコードが作成されるかどうかを表示

例のデータ

Received Name Sub 
01-Jun  Mike Over 
01-Jun  John Over 
02-Jun  Dave Between 
03-Jun  Pete Over 
02-Jun  Mike Under 
03-Jun  Dave Under 

望ましい結果

Received Name Sub  Sub2 
01-Jun  Mike Over Under 
01-Jun  John Over Null 
02-Jun  Dave Between Under 
03-Jun  Pete Over Null 

私はこのコードから作業が、私はもう木のために木を参照してください傾けることをそのように恐ろしく間違っています。

DECLARE @TM DATETIME; 
SET @TM = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101'); 

select 
t1.received, 
t1.name, 
t1.sub, 
t2.sub as sub2 

from 
dbo.tblOpen t1 
join dbo.tblOpen t2 on t1.name = t2.name 

where 
t1.closed >= DATEADD(MONTH, -1, @TM) 

ここで正しい方向にポイントを取得してください。

+0

TIMESTAMPDIFFは便利な機能です。 – fungusanthrax

+0

@fungusanthrax 'TIMESTAMPDIFF()'はMySQLです... –

答えて

2

このアプローチにはさまざまな方法があります。

Aは、サブクエリが動作するはず相関:

SELECT t1.received, 
     t1.name, 
     t1.sub, 
     CASE WHEN EXISTS (SELECT * 
         FROM dbo.tblOpen t2 
         WHERE t2.Name = t1.Name 
         AND t2.received > t1.received 
         AND t2.sub = 'UNDER') 
      THEN 'UNDER' 
     END AS sub2 
FROM dbo.tblOpen t1 
WHERE t1.sub <> 'UNDER' 

またはLEFT JOIN

SELECT t1.received, 
     t1.name, 
     t1.sub, 
     t2.sub as sub2 
FROM dbo.tblOpen t1 
LEFT JOIN dbo.tblOpen t2 ON t2.Name = t1.Name 
         AND t2.received > t1.received 
         AND t2.sub = 'UNDER' 
WHERE t1.sub <> 'UNDER' 

あなたの本当のデータに応じて、物事はより複雑に得ることができます。たとえば、指定された名前に対して複数の「UNDER」が発生する可能性がありますか?そうであれば、それを1回だけ見たいのですか、オカレンスごとに1回だけ見たいですか?とにかく、これはあなたのサンプルデータが与えられたときの良い出発点です。

+0

'アンダー'はいくつかの機会に複数回出現しますが、探している関連データを単に表示するように '名前'または '受信済み'でフィルタリングできます。どちらの例も完璧に動作します。 (遅い返事にも申し訳ありません) – Michael

関連する問題