programing

열 필드에 대해 두 행의 차이를 얻는 방법은 무엇입니까?

projobs 2021. 1. 14. 08:01
반응형

열 필드에 대해 두 행의 차이를 얻는 방법은 무엇입니까?


다음과 같은 테이블이 있습니다.

rowInt  Value
2       23
3       45
17      10
9       0
....

rowInt 열 값은 정수이지만 동일한 비명을 가진 시퀀스가 ​​아닙니다. 다음 SQL을 사용하여 rowInt로 값을 나열 할 수 있습니다.

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 (Miscrosoft)에 있습니다.


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의 대답)에서 하위 쿼리를 사용하는 것이 더 효율적일 수 있습니다. 다른 버전을 시험 해보고 실행 계획을 살펴보고 보유한 데이터 세트의 크기에서 어떤 것이 가장 잘 수행되는지 확인합니다.


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 / LEAD 기능을 지원 합니다. SQL Server 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 (value)는 "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

In a query to get the difference between column a and b:

SELECT a, b, dbo.NumDifference(a, b) FROM YourTable

ReferenceURL : https://stackoverflow.com/questions/634568/how-to-get-difference-between-two-rows-for-a-column-field

반응형