2014-10-12 2 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

Пожалуйста, расскажите нам немного о ваших таблицах ввода и о том, какой результат вы ожидаете. Кроме того, сколько строк имеют таблицы? –

+0

Вы хотите «Топ 1 Дата», чтобы получить последнюю дату действия первого лица? –

ответ

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 
Смежные вопросы