2014-01-31 6 views
0

у меня есть эта таблица:Как получить меньше строк?

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

Какую версию SQL Server вы используете, пожалуйста? –

+1

Являются ли идентификаторы гарантированными последовательными без пробелов? –

ответ

3

Вы были близки, предполагая, что идентификаторы в порядке, вы хотите, и не было пробелов:

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 

Это возвращает 4-ю строку с NULL, поэтому можно использовать cte/subquery, чтобы ограничить 3 строки с заполненными значениями.

Обратите внимание, если идентификаторы не gauranteed быть в порядке, вы хотите, или если имеются пробелы между некоторыми идентификаторами вы должны использовать функцию 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

Попробуйте это:

SELECT 
    T1.rate - T2.rate as rateDiff 
FROM table1 T1 
    JOIN table1 T2 
    ON T1.id = T2.Id + 1 
Смежные вопросы