如何检索更少的行?

时间:2014-01-31 22:41:19

标签: sql sql-server tsql

我有这张桌子:

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

2 个答案:

答案 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