我正面临这个问题,我需要根据相同的标准将最近的行与前一行进行比较(在这种情况下,它将是交易者)。
这是我的表:
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
上面并不完美,因为我只想比较最近的和之前的......在这个例子中
感谢您的帮助!
答案 0 :(得分:0)
如果您使用的是SQL Server 2012或更高版本,则可以使用函数LEAD
和LAG
来加入上一个和下一个数据。不幸的是,这些函数只能在SELECT
或ORDER 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的这些行 - 这表明这是特定交易者的最后一行。