복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.합니까 SQL 서버 분석 기능을 지원합니까?

    합니까 SQL 서버 분석 기능을 지원합니까?

    select   rowint,
             value,
             value - lag(value) over (order by rowint) diff
    from     myTable
    order by rowint
    /
    
  6. ==============================

    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. ==============================

    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. ==============================

    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
    
  9. from https://stackoverflow.com/questions/634568/how-to-get-difference-between-two-rows-for-a-column-field by cc-by-sa and MIT license