I have a table 다음과 같습니다.
rowInt Value
2 23
3 45
17 10
9 0
....
로베르트 같은 열의 값은 정수 있지만 시퀀스일 잉크리먼트. 난 다음 sql 을 목록값 로베르트 통해 사용할 수 있습니다.
SELECT * FROM myTable ORDER BY rowInt;
이를 통해 목록값 로베르트. 그 결과 2 행 사이의 값을 주고 받을 수 있는 방법을 내려받습니다 다음과 같습니다.
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
Sql 의 테이블 (table) 은 2005년 (마이크로소프트)
SELECT
[current].rowInt,
[current].Value,
ISNULL([next].Value, 0) - [current].Value
FROM
sourceTable AS [current]
LEFT JOIN
sourceTable AS [next]
ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
편집: 생각하고, 서브케리 사용하여 선택 (ala Quassnoi& # 39 의 답) 더 효율적일 수 있습니다. 다른 버전을 보면 꼭 이래야겠어요 평가판의 실행 계획을 수행할 것이라고 볼 수 있는 최고의 규모에 따라 데이터 집합을 가지고 있는지.
SQL Server 2012년 이상 지원 지연 / 주관업체로 기능을 이전 또는 이후에 액세스하려면 행일. SQL Server 2005년 에서는 이를 지원하지 않습니다 () 에서 조인 또는 필요한 SQL2005 something else).
Sql 2012년 들어 이 데이터에 대해
/* Prepare */
select * into #tmp
from
(
select 2 as rowint, 23 as Value
union select 3, 45
union select 17, 10
union select 9, 0
) x
/* The SQL 2012 query */
select rowInt, Value, LEAD(value) over (order by rowInt) - Value
from #tmp
리드 (값) 는 다음 행에 존중하십시오 주어진 값을 되돌려줍니다 오더할 " over"; 핵심이 되는 말이다.
당신이 정말로 " Row_Number (), 주문이 " 사용할 수 있기를 원합니다. 그리고 현재 레코드 (take a look at, on", " 닫으십시오 비교하십시오 다음 레코드 항)
T1.ID + 1 = T2.ID
현재 행, 행, 기본적으로 다음) 에 있는 " min" 지정하지 않고 있습니다. 하고, 또는 " top". 적은 수의 레코드전자문서의 의해 다른 솔루션의 경우 " Dems"; 또는 " Quassanoi"; 정상적으로 작동합니다.
with T2 as (
select ID = ROW_NUMBER() over (order by rowInt),
rowInt, Value
from myTable
)
select T1.RowInt, T1.Value, Diff = IsNull(T2.Value, 0) - T1.Value
from ( SELECT ID = ROW_NUMBER() over (order by rowInt), *
FROM myTable ) T1
left join T2 on T1.ID + 1 = T2.ID
ORDER BY T1.ID
그냥 조금 기능을 할 수 있는 i&; d # 39. 토스 2 개의 값을 you need to know) 의 차이점을 할꺼이나 subtract 작은 더 큰 값. 다음과 같은 항목을
CREATE FUNCTION [dbo].[NumDifference]
( @p1 FLOAT,
@p2 FLOAT )
RETURNS FLOAT
AS
BEGIN
DECLARE @Diff FLOAT
IF @p1 > @p2 SET @Diff = @p1 - @p2 ELSE SET @Diff = @p2 - @p1
RETURN @Diff
END
쿼리하지 열 수 있는 차이점은 a 와 b:
SELECT a, b, dbo.NumDifference(a, b) FROM YourTable
select t1.rowInt,t1.Value,t2.Value-t1.Value as diff
from (select * from myTable) as t1,
(select * from myTable where rowInt!=1
union all select top 1 rowInt=COUNT(*)+1,Value=0 from myTable) as t2
where t1.rowInt=t2.rowInt-1
날짜 차이를 찾기 위해 2 행 하나의 열에 쿼리하지
SELECT
Column name,
DATEDIFF(
(SELECT MAX(date) FROM table name WHERE Column name < b. Column name),
Column name) AS days_since_last
FROM table name AS b