열 필드에 대한 두 행 간의 차이를 얻는 방법은 무엇입니까?
다음과 같은 테이블이 있습니다.
rowInt Value
2 23
3 45
17 10
9 0
....
열 rowInt 값은 정수이지만 증분이 같은 순서가 아닙니다.다음 SQL을 사용하여 행별로 값을 나열할 수 있습니다.내부:
SELECT * FROM myTable ORDER BY rowInt;
행 Int별로 값이 나열됩니다.다음과 같은 결과로 두 행 사이의 값 차이를 가져올 수 있는 방법은 무엇입니까?
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(Microsoft)에 있습니다.
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의 답변)에서 하위 쿼리를 사용하는 것이 더 효율적일 수 있습니다.여러 버전을 사용해보고 실행 계획을 검토하여 데이터 세트의 크기에 가장 적합한 것을 확인합니다.
EDIT2:
SQL Server 2005를 사용하는 사람은 많지 않을 것입니다.
다음과 같은 Windowed 기능에 액세스할 수 있는 경우LEAD()
그럼 그걸 대신 사용해요...
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable
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
SQL Server 2012 이상에서는 이전 행 또는 이후 행에 액세스할 수 있는 LAG/LED 기능을 지원합니다. SQL Server 2005에서는 이 기능을 지원하지 않습니다. SQL Server 2005에서는 가입 또는 다른 기능이 필요합니다.
이 데이터에 대한 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
LED(값)는 "over" 절에서 주어진 순서에 대해 다음 행의 값을 반환합니다.
주문을 확실히 하려면 "Row_Number()"를 사용하여 현재 레코드의 다음 레코드를 비교합니다("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
SQL Server는 분석 기능을 지원합니까?
select rowint,
value,
value - lag(value) over (order by rowint) diff
from myTable
order by rowint
/
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
단일 열의 두 행 간의 날짜 차이를 찾기 위한 쿼리
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
저는 그것을 위해 작은 기능을 만들 것입니다.사이의 차이를 알아야 하는 두 값을 넣고 큰 값에서 작은 값을 빼도록 합니다.다음과 같은 것:
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
언급URL : https://stackoverflow.com/questions/634568/how-to-get-difference-between-two-rows-for-a-column-field
'programing' 카테고리의 다른 글
openpyxl을 사용하여 특정 값의 셀이 포함된 행 찾기 (0) | 2023.07.02 |
---|---|
MongoDB(pymongo를 통해)를 효율적으로 인식하지 못하는 경우 쿼리 (0) | 2023.07.02 |
다중 모듈 Spring Boot 프로젝트의 Gradle 종속성 플러그인 (0) | 2023.07.02 |
C 컴파일러가 외부 이름에 밑줄을 추가하는 이유는 무엇입니까? (0) | 2023.07.02 |
Git는 왜 내가 원점으로 밀어 넣으려고 할 때 "그렇게 먼 '원점'은 없다"고 말합니까? (0) | 2023.07.02 |