Получить следующее значение для каждого из значений из следующей таблицы CTE - PullRequest
2 голосов
/ 21 октября 2019

У меня есть следующая таблица: dbo.split

Name  Time   
Alex  120
John  80 
John  300 
Mary  500
Bob   900

А затем еще одна таблица dbo.travel

Name Time
Alex  150
Alex  160 
Alex  170
John  90
John  100
John  310  
Mary  550
Mary  600 
Mary  499 
Bob   800
Bob   700

Для каждого значения в разбиении таблицы мне нужно найти следующее значениев таблице путешествий. Я попытался сделать это с помощью CTE a с помощью ROW_NUMBER (), чтобы перейти к следующей группе, но я не могу сгруппировать по правильному значению, поскольку dbo.split может содержать несколько значений для одного и того же имени.

Я ищу следующий вывод:

Name  Time TravelTime 
Alex  120  150
John  80   90
John  300  310
Mary  500  550
Bob   900  NULL   

Вот то, что у меня есть, но это не удается, потому что разделенная таблица может иметь несколько записей на человека:

;with result as (
 select t.*, 
 ROW_NUMBER() OVER (Partition BY t.Name order by t.Time) as rn 
 from travel t join split s 
 on t.Name = s.Name and t.TIME>s.Time
 )

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Я бы использовал apply:

select s.*, t.time
from split s outer apply
     (select top (1) t.*
      from travel t
      where t.name = s.name and t.time > s.time
      order by t.time asc
     ) t;

В этом случае apply выполняет по существу то же самое, что и коррелированный подзапрос, так что вы могли бы также сформулировать это так.

0 голосов
/ 21 октября 2019

Вы можете попробовать, как показано ниже

   Select * from(Select 
        Name,t.time,t1.time, 
       Row_number() over (partition by
        Name,t.time order by t1.time) rn
        from split t
       Join travel t1 on t.time <t1.time and 
          t.name =t1.name) 
          where 
           rn=1;
...