将最近一行与同一表中的前一行进行比较

时间:2015-09-26 19:07:31

标签: sql-server sql-server-2014

我正面临这个问题,我需要根据相同的标准将最近的行与前一行进行比较(在这种情况下,它将是交易者)。

这是我的表:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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的这些行 - 这表明这是特定交易者的最后一行。