2015-12-10 6 views
-1

Я попытался получить данные из предыдущей записи в наборе данных и использовать некоторые данные из этой предыдущей записи. Записи привязаны к моему идентификатору активов, и я думаю, что я приближаюсь, но мне сейчас нужно совет экспертов, чтобы преодолеть последнее препятствие. Ниже приведено заявление, которое я придумал, но я получаю сообщение об ошибке, и я вижу, откуда исходит ошибка, но я не знаю, как обойти его. Мой код:SQL User Defined Функция поиска предыдущей записи

SELECT location, 
(SELECT TOP (1) week_number 
FROM dbo.tbl_job_planning AS l2 
WHERE week_number < dbo.tbl_job_planning.week_number 
ORDER BY week_number DESC) AS prev_week 
FROM dbo.tbl_job_planning 
WHERE fleet_no = @fleet AND week_number = prev_week 
ORDER BY date_starting DESC 

Проблема заключается в том, что prev_week не фактический столбец в моей таблице это делается «на лету». Пожалуйста, скажите мне, кто-то указывает мне в правильном направлении.

+0

Возможный дубликат [Запрос TSQL для ссылки на предыдущие строки] (http://stackoverflow.com/questions/28553825/tsql-query-to-reference-previous-rows) –

ответ

0

Вы можете заказать недели с помощью оконной функции ROW_NUMBER() с разделом на fleet_no.

Это должно работать для вас:

;With WeekOrder As 
(
    Select *, Row_Number Over (Partition By fleet_no Order By week_number Asc) As Row_Number 
    From tbl_job_planning 
) 
Select  C.location, P.week_number As Prev_week 
From  WeekOrder C 
Left Join WeekOrder P On C.Row_Number - 1 = P.Row_Number 
          And C.fleet_no = P.fleet_no 
Where  C.fleet_no = @fleet 
Order By C.date_starting Desc 
1
WITH data_with_rn AS 
(
    SELECT location, fleet_no, week_number, 
     ROW_NUMBER() (PARTITION BY fleet_no, ORDER BY week_number DESC) as week_rn 
    FROM dbo.tbl_job_planning 
) 
SELECT base.location, base.date_starting, prior.week_number as prev_week 
FROM data_with_rn base 
LEFT JOIN data_with_rn prior ON prior.week_rn = base.week_rn - 1 AND base.fleet_no = prior.fleet_no 
WHERE base.fleet_no = @fleet 
ORDER BY base.date_starting DESC 
1

Я думаю, что вы можете избежать самоприсоединение с помощью LAG функции (доступный от SQL Server 2012):

with WeekOrder AS (
    select C.location, C.fleet_no, C.date_starting, LAG(location, 1, NULL) OVER (Partition By fleet_no Order By week_number Asc) AS PrevLocation 
    FROM dbo.tbl_job_planning C 
) 
select * 
from WeekOrder C 
Where  C.fleet_no = @fleetNo 
    and PrevLocation IS NOT NULL 
Order By C.date_starting Desc 

Кроме того, запрос немного меньше и должен иметь лучший план выполнения, чем версии для самостоятельного присоединения.

Смежные вопросы