2015-02-17 4 views
1

Мне нужна помощь с запросом. У меня есть запрос, возвращающий простой набор строк.TSQL Query для ссылки на предыдущие строки

SELECT  TOP 5 
      ReceivedYTD, 
      InvoicedYTD, 
      OrderedYTD, 
      YearReported, 
      WeekReported 
FROM  Products 
WHERE  ProductId = @ProductId 
ORDER BY YearReported DESC, 
      WeekReported DESC 

Неделя и год сообщили столбцы упорядочены по может иметь пробелы (например, 1,2,4,5,6,9 ...)

Что я хотел бы сделать, это также выбрать для изменение значений из предыдущей записи в последовательности заказов. Итак, на 5-й неделе я мог видеть, как она изменилась с 4-й недели, а на 4-й неделе я увижу, как она изменилась в форме недели 2 и т. Д. Из-за возможного разрыва в последовательности я не могу просто сделать рекурсивное левое соединение (или, по крайней мере, я не думаю, что я могу.)

+0

Какую версию SQL Server вы используете? В частности, вы используете 2012 или более ранний? –

+0

Он будет развернут до 2012 года. –

ответ

3

Для SQL Server 2012+:

вы можете использовать LAG функция.

Вот пример, чтобы найти предыдущее полученное значение, тогда, конечно, другие будут очень хорошо совпадать.

SELECT  TOP 5 
      ReceivedYTD, 
      InvoicedYTD, 
      OrderedYTD, 
      YearReported, 
      WeekReported, 

-- Relevant part 
      LAG(ReceivedYTD) 
       OVER (ORDER BY YearReported DESC, WeekReported DESC) AS PreviousReceivedYTD 
-- End relevant part 

FROM  Products 
WHERE  ProductId = @ProductId 
ORDER BY YearReported DESC, 
      WeekReported DESC 

В противном случае

я был уже хорошо в этот ответ, прежде чем комментировал назад, так что я просто пошел с ним.

Вы должны использовать CTE и присоединить его к себе по смещению номера строки, которое вы ищете.

WITH CTE AS (
    SELECT  TOP 5 
       RowNumber = ROW_NUMBER() OVER (ORDER BY YearReported DESC, WeekReported DESC) 

       ReceivedYTD, 
       InvoicedYTD, 
       OrderedYTD, 
       YearReported, 
       WeekReported, 
    FROM  Products 
    WHERE  ProductId = @ProductId 
    ORDER BY YearReported DESC, 
       WeekReported DESC 
) 

SELECT CTE.ReceivedYTD, 
     CTE.InvoicedYTD, 
     CTE.OrderedYTD, 
     CTE.YearReported, 
     CTE.WeekReported, 
     PreviousRow.ReceivedYTD AS PreviousReceivedYTD 
FROM CTE 
    LEFT OUTER JOIN CTE PreviousRow ON CTE.RowNumber - 1 = PreviousRow.RowNumber 
2

вы можете использовать задержку, так как вы находитесь на 2012:

SELECT  TOP 5 
      ReceivedYTD, 
      LAG(ReceivedYTD, 1, 'NA') OVER (
       PARTITION BY ProductId ORDER BY YearReported DESC, WeekReported DESC) AS RecievedYTD_Last, 
      InvoicedYTD, 
      LAG(InvoicedYTD, 1, 'NA') OVER (
       PARTITION BY ProductId ORDER BY YearReported DESC, WeekReported DESC) AS InvoicedYTD_Last, 
      OrderedYTD, 
      LAG(OrderedYTD, 1, 'NA') OVER (
       PARTITION BY ProductId ORDER BY YearReported DESC, WeekReported DESC) AS OrderedYTD_Last, 
      YearReported, 
      WeekReported, 
FROM  Products P 
WHERE  ProductId = @ProductId 
ORDER BY YearReported DESC, 
      WeekReported DESC 
+0

Спасибо, Джейсон! знак равно –

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