2015-09-01 4 views
2

Допустим, у меня есть таблица с присоединиться выбрать так:Как сравнить последнюю запись и последнюю запись - 1?

No.Transaction Item Name PRICE 
TC0001   Book  15 
TC0001   Pencil  2 
TC0001   Eraser  1 
TC0002   Book  12 
TC0002   Eraser  1.5 
TC0003   Pencil  1.8 
TC0003   Book  20 

Я хочу, чтобы сравнить последнюю цену и свою прежнюю цену за то же имя элемента. Например, Book is 20 and 12, Pencil is 1.8 and 2

Как я могу это сделать?

+1

Что вы имеете в виду, если сравнивать? Какую версию SQL Server вы используете? –

ответ

-2

Обработка запросов. Добавляем группу по, ограничиваем (2), заказываем DESC. вы должны получить то, что вам нужно.

+0

SQL Server не имеет функции 'limit()';). –

3

вы должны найти колонку для того, ваш результат затем использовать DENSE_RANK() и получить 2 последнюю строку как этот

SELECT * 
(
    SELECT transactionId 
     ,itm_name 
     ,price 
     ,DENSE_RANK() OVER (PARTITION BY itm_name ORDER BY created_date DESC) AS [rank] 
    FROM tbl 
) res 
WHERE res.[rank] IN (1,2) 
ORDER BY res.[rank] 
+0

AFAIK; Использование 'WHERE res. [Rank] <3' лучше и быстрее, а' DENSE_RANK() 'может оценивать одни и те же две или более записи, вместо этого используйте' ROW_NUMBER() ';). –

6

Я думаю, что вам нужен запрос, как это:

;WITH t AS (
    SELECT * 
     , ROW_NUMBER() OVER (PARTITION BY [Item Name] 
          ORDER BY [No.Transaction] DESC) As seq 
    FROM yourTable) 
SELECT t1.[Item Name] 
    , t1.PRICE As lastPrice 
    , t2.PRICE As preLastPrice 
    , t1.PRICE - ISNULL(t2.PRICE, 0) As changePrice 
FROM t t1 
    LEFT JOIN 
    t t2 ON t1.[Item Name] = t2.[Item Name] AND t1.seq = t2.seq - 1 
WHERE (t1.seq = 1); 

[SQL Fiddle Demo]

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