[SQL] 어떻게 열 필드에 두 행의 차이를 얻으려면?
SQL어떻게 열 필드에 두 행의 차이를 얻으려면?
나는이 같은 테이블이 있습니다 :
rowInt Value
2 23
3 45
17 10
9 0
....
열 rowInt 값은 동일한 증가량 시퀀스에 정수가 아닌이다. 나는 rowInt에 의해 목록 값에 다음 SQL을 사용할 수 있습니다 :
SELECT * FROM myTable ORDER BY rowInt;
이 rowInt에 의해 값을 나열합니다. 어떻게 이런 결과에 두 행 사이의 값의 차이를 얻을 수 있습니다 :
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
표는 SQL 2005에 (마이크로 소프트)
해결법
-
==============================
1.
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)
편집 : (Quassnoi의 대답 ALA), 그것에 대해 생각 선택에 하위 쿼리를 사용하여보다 효율적으로 할 수있다. 나는 것 재판 서로 다른 버전 및 실행 계획에서 보면 당신이 가지고있는 데이터 세트의 크기에 최선을 수행 할 것이다 볼 수 ...
-
==============================
2.
SELECT rowInt, Value, COALESCE( ( SELECT TOP 1 Value FROM myTable mi WHERE mi.rowInt > m.rowInt ORDER BY rowInt ), 0) - Value AS diff FROM myTable m ORDER BY rowInt
-
==============================
3.SQL 서버 2012 지원 LAG 업 / LEAD 기능은 이전 또는 이후의 행에 액세스 할 수 있습니다. SQL 서버 2005 (SQL2005에서 당신은 다른 뭔가를 가입하거나 필요)이 지원되지 않습니다.
SQL 서버 2012 지원 LAG 업 / LEAD 기능은 이전 또는 이후의 행에 액세스 할 수 있습니다. SQL 서버 2005 (SQL2005에서 당신은 다른 뭔가를 가입하거나 필요)이 지원되지 않습니다.
이 데이터에 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
LEAD (값) 절 "이상"에 주어진 순서에 관련하여 다음 행의 값을 반환합니다.
-
==============================
4.당신이 정말로 확실 주문하고 싶다면, 사용 "ROW_NUMBER는 ()"과 현재 레코드의 다음 레코드를 비교 (절 "의"를 자세히 살펴)
당신이 정말로 확실 주문하고 싶다면, 사용 "ROW_NUMBER는 ()"과 현재 레코드의 다음 레코드를 비교 (절 "의"를 자세히 살펴)
T1.ID + 1 = T2.ID
당신은 기본적으로 "분"을 지정 또는 "최고"를하지 않고, 현재의 행과 다음 행에 합류한다. 당신이 기록의 수가 적은 경우, "민주당 원"또는 "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
-
==============================
5.합니까 SQL 서버 분석 기능을 지원합니까?
합니까 SQL 서버 분석 기능을 지원합니까?
select rowint, value, value - lag(value) over (order by rowint) diff from myTable order by rowint /
-
==============================
6.
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
-
==============================
7.쿼리는 하나의 열 2 열 사이의 날짜 차이를 찾기
쿼리는 하나의 열 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
-
==============================
8.난 그냥 그것에 대해 약간의 기능을 할 것입니다. 당신의 차이를 알고는 큰 값에서 작은 빼기가 필요 두 값에 던져. 뭔가 같은 :
난 그냥 그것에 대해 약간의 기능을 할 것입니다. 당신의 차이를 알고는 큰 값에서 작은 빼기가 필요 두 값에 던져. 뭔가 같은 :
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
from https://stackoverflow.com/questions/634568/how-to-get-difference-between-two-rows-for-a-column-field by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] VBA 매크로 통합 문서에서 엑셀 표에 SQL 쿼리를 수행 (0) | 2020.03.27 |
---|---|
[SQL] 내가 어떻게 LIKE 연산자에서 여러 조건을 도입 할 수 있습니다 (0) | 2020.03.27 |
[SQL] SELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요? (0) | 2020.03.27 |
[SQL] SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까? (0) | 2020.03.27 |
[SQL] 어떻게 Laravel 쿼리 빌더를 사용하여 하위 쿼리에서 선택? (0) | 2020.03.27 |