2017-08-08 111 views
1

我希望能夠檢查某個特定的記錄(在本例中,「under」是在創建一個初始記錄後創建的, 「下」或空。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

很多方法來處理這一個。

相關子查詢應該工作:

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'是否可以多次出現?如果是這樣,你只想看一次,或每次出現一次?無論如何,根據您的示例數據,這是一個很好的起點。

+0

'Under'在某些場合確實會出現不止一次,但可以通過'name'或'received'進行過濾,以便它只顯示我正在查找的相關數據。謝謝你們兩個例子的完美運作。 (對於遲到的回覆也很抱歉) – Michael

相關問題