我有这张桌子:
USE [testing]
GO
/****** Object: Table [dbo].[table1] Script Date: 1/02/2014 9:35:13 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table1](
[id] [int] NOT NULL,
[date] [datetime] NULL,
[rate] [decimal](18, 0) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[table1] ([id], [date], [rate]) VALUES (1, CAST(0x0000A2A600000000 AS DateTime), CAST(12 AS Decimal(18, 0)))
GO
INSERT [dbo].[table1] ([id], [date], [rate]) VALUES (2, CAST(0x0000A2A700000000 AS DateTime), CAST(2 AS Decimal(18, 0)))
GO
INSERT [dbo].[table1] ([id], [date], [rate]) VALUES (3, CAST(0x0000A2A800000000 AS DateTime), CAST(3 AS Decimal(18, 0)))
GO
INSERT [dbo].[table1] ([id], [date], [rate]) VALUES (4, CAST(0x0000A2A900000000 AS DateTime), CAST(56 AS Decimal(18, 0)))
GO
我想返回2行之间的差异,并返回3行:
-10
1
43
我该如何更改此查询?
select t1.rate-t2.rate
from table1 t1
join table1 t2 on
t1.id> t2.id
where (t2.id-t1.id) <=1
答案 0 :(得分:3)
你很接近,假设ID是你想要的顺序而没有差距:
SELECT t1.rate-t2.rate
FROM Table1 t1
JOIN Table1 t2
ON t1.id = t2.id + 1
如果使用SQL Server 2012,您可以使用LEAD()
功能:
SELECT rate - LEAD(rate) OVER (ORDER BY id)
FROM Table1
返回带有NULL
的第4行,因此可以使用cte / subquery来限制带有填充值的3行。
注意,如果ID没有按照您想要的顺序进行保护,或者某些ID之间存在间隙,则应使用ROW_NUMBER()
函数(如果未使用LEAD()
版本ORDER BY
):
WITH cte AS (SELECT *,ROW_NUMBER() OVER(ORDER BY id) RN
FROM Table1)
SELECT t1.rate-t2.rate
FROM cte t1
JOIN cte t2
ON t1.RN = t2.RN + 1
所有3的演示:SQL Fiddle
答案 1 :(得分:1)
试试这个:
SELECT
T1.rate - T2.rate as rateDiff
FROM table1 T1
JOIN table1 T2
ON T1.id = T2.Id + 1