2017-08-08 134 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

相关问题