2015-09-26 84 views
0

我正面臨着這個問題,我需要根據相同的標準比較最近一行和最近一行(在這種情況下,這將是交易者 )。將最近一行與同一表中的最近一行進行比較

這裏是我的表:

ID Trader Price 
----------------- 
1 abc  5 
2 xyz  5.2 
3 abc  5.7 
4 xyz  5 
5 abc  5.2 
6 abc  6 

這裏是腳本

CREATE TABLE Sale 
(
    ID int not null PRIMARY KEY , 
    trader varchar(10) NOT NULL, 
    price decimal(2,1), 
) 

INSERT INTO Sale (ID,trader, price) 
VALUES (1, 'abc', 5), (2, 'xyz', 5.2), 
     (3, 'abc', 5.7), (4, 'xyz', 5), 
     (5, 'abc', 5.2), (6, 'abc', 6); 

到目前爲止,我與這個解決方案是不完美的工作尚未

select 
    a.trader, 
    (a.price - b.price) New_price 
from 
    sale a 
join 
    sale b on a.trader = b.trader and a.id > b.ID 
left outer join 
    sale c on a.trader = c.trader and a.id > c.ID and b.id < c.ID 
where 
    c.ID is null 

上面沒有完美,因爲我想只比較最近與前一個...在此示例中,例如

  • 交易ABC:我只是比較ID = 6和id = 5
  • 交易XYZ:ID = 4和id = 2

感謝您的幫助!

+0

您正在使用哪個SQL Server版本? – dotnetom

+0

我正在使用SQL 2014 – user32762

+0

然後我提供的答案應該爲你工作 – dotnetom

回答

0

如果您使用SQL Server 2012或更高版本,則可以使用函數LEADLAG來加入上一個和下一個數據。不幸的是,這些功能只能在SELECTORDER BY子句中使用,所以你需要使用子查詢來獲得您需要的數據:

SELECT t.trader, t.current_price - t.previous_price as difference 
FROM (
    SELECT 
     a.trader, 
     a.price as current_price, 
     LAG(a.price) OVER(PARTITION BY a.trader ORDER BY a.ID) as previous_price, 
     LEAD(a.price) OVER(PARTITION BY a.trader ORDER BY a.ID) as next_price 
    FROM sale a 
) t 
WHERE t.next_price IS NULL 

在這裏,你的子查詢您創建一個和下一個值的附加列。然後在你的主要查詢中,只過濾下一行價格爲NULL的行 - 表示這是特定交易者的最後一行。