2014-10-12 41 views
0

我有两个表具有以下结构高性能TSQL检索数据

Person(ID, Name, ...) 
Action(ID, FirstPersonId, SecondPersonId, Date) 

我想检索该数据为每个人:

行动,一个人是从去年第二个人数行动 这是对第一人称

当前查询

Select Result.Id , 
     (Select Count(*) 
      From Action 
      Where SecondPersonId = Result.Id 
        AND Date > Result.LastAction) 
    From  
      (Select ID , 
        ( 
         Select Top 1 Date 
          From Action 
          Where Action.FirstPersonId = Person.Id 
        ) as LastAction 
       From Person) As Result 

这个查询性能不好,我需要更好的一个。

+0

请告诉我们一些关于您的输入表和您期望的输出。另外,表格有多少行? – 2014-10-12 06:53:54

+0

你想要“前1个日期”来获取第一个人的最后一个行动日期吗? – 2014-10-12 06:56:48

回答

2
with lastActionPerson as -- last action for every first person 
(select FirstPersonId , max([Date]) as LastActionDate 
    from Action 
) 
select a.SecondPersonId ,count(*) 
    from lastActionPerson lap 
    join Action a 
    on a.SecondPersonId = lap.FirstPersonId -- be on second person 
    and a.[Date] > lap.lastActionDate 
-- you could continue to right join person table to show the person without actions 
group by a.SecondPersonId