복붙노트

[SQL] SELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요?

SQL

SELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요?

나는 테이블의 두 줄 사이에 열의 차이를 계산해야합니다. 나는 SQL이 직접 할 수있는 방법이 있습니까? 나는 마이크로 소프트 SQL 서버 2008을 사용하고 있습니다.

나는 이런 식으로 뭔가를 찾고 있어요 :

SELECT value - (previous.value) FROM table

은 "이전"변수 참조 최신 선택한 행 것을 상상. A를 물론 실제로 내가 필요 정확히 무엇이며, 내가 N-1 행 N있는 테이블에서 선택된 행하는 아마 아니다으로 끝날 것 같은 선택합니다.

그 어떤 방법으로 할 수 있습니까?

해결법

  1. ==============================

    1.이 의미가 될 수 있도록 일부 열을 기준으로 주문해야하므로 SQL은 더 순서의 개념에 내장 없다. 이 같은:

    이 의미가 될 수 있도록 일부 열을 기준으로 주문해야하므로 SQL은 더 순서의 개념에 내장 없다. 이 같은:

    select t1.value - t2.value from table t1, table t2 
    where t1.primaryKey = t2.primaryKey - 1
    

    당신이 주문 것들에 아닌 것은 현재의 주어진 이전 값을 얻는 방법을 알고 있다면 내가 표준 SQL에서 그렇게 할 수있는 방법을 모른다 (예를 들어, 당신은 알파벳 순서로 원하는)하지만, 대부분의 SQL 구현해야합니다 확장을 할 수 있습니다.

    다음은 각각 구별되도록 행을 주문할 수있는 경우에 작동하는 SQL 서버에 대한 방법입니다 :

    select  rank() OVER (ORDER BY id) as 'Rank', value into temp1 from t
    
    select t1.value - t2.value from temp1 t1, temp1 t2 
    where t1.Rank = t2.Rank - 1
    
    drop table temp1
    

    당신이 관계를 중단해야하는 경우 BY 순서에 필요한 여러 열로 추가 할 수 있습니다.

  2. ==============================

    2.지연 기능을 사용 :

    지연 기능을 사용 :

    SELECT value - lag(value) OVER (ORDER BY Id) FROM table
    

    ID-1은 항상 일을하지 않도록, 값을 건너 뛸 수 있습니다 IDS에 사용되는 시퀀스.

  3. ==============================

    3.오라클, PostgreSQL을, SQL Server 및 더 많은의 RDBMS 엔진은 바로이 일을 LAG과 LEAD라는 분석 기능을 가지고 있습니다.

    오라클, PostgreSQL을, SQL Server 및 더 많은의 RDBMS 엔진은 바로이 일을 LAG과 LEAD라는 분석 기능을 가지고 있습니다.

    이전 2012 SQL 서버에서는 다음을 수행해야 할 것입니다 :

    SELECT  value - (
            SELECT  TOP 1 value
            FROM    mytable m2
            WHERE   m2.col1 < m1.col1 OR (m2.col1 = m1.col1 AND m2.pk < m1.pk)
            ORDER BY 
                    col1, pk
            )
    FROM mytable m1
    ORDER BY
          col1, pk
    

    여기서 COL1은 당신에 의해 주문하는 열입니다.

    (COL1, PK)에 인덱스를 갖는 것은 크게이 쿼리를 향상시킬 수 있습니다.

  4. ==============================

    4.

    WITH CTE AS (
      SELECT
        rownum = ROW_NUMBER() OVER (ORDER BY columns_to_order_by),
        value
      FROM table
    )
    SELECT
      curr.value - prev.value
    FROM CTE cur
    INNER JOIN CTE prev on prev.rownum = cur.rownum - 1
    
  5. ==============================

    5.(가) 테이블의 합류 버전에 일치하는 행이 "이전"의 특정 정의, 하나 개의 행 이전 그래서 조건이 밖으로 일에 참여 왼쪽은, 그 자체로 테이블에 가입하세요.

    (가) 테이블의 합류 버전에 일치하는 행이 "이전"의 특정 정의, 하나 개의 행 이전 그래서 조건이 밖으로 일에 참여 왼쪽은, 그 자체로 테이블에 가입하세요.

    업데이트 : 처음 엔에서 당신이 더 이전 행 없었다 조건에 대한 null로, 모든 행을 유지하려는 것이라고 생각했다. 당신이 내부 오히려 왼쪽보다는 가입에 가입해야합니다, 그래서 다시 그냥, 그 행이 추려 원하는 그것을 읽기.

    최신 정보:

    는 SQL 서버의 최신 버전은 또한 LAG가 너무,이에 사용할 수있는 윈도 윙 기능을지도한다.

  6. ==============================

    6.

    select t2.col from (
    select col,MAX(ID) id from 
    (
    select ROW_NUMBER() over(PARTITION by col order by col) id ,col from testtab t1) as t1
    group by col) as t2
    
  7. ==============================

    7.순서에는 차이가없는 경우 선택한 답변에만 작동합니다. 당신이 자동 생성 된 ID를 사용하는 경우 그러나, 롤백 된 삽입에 순서에 차이가 될 가능성이있다.

    순서에는 차이가없는 경우 선택한 답변에만 작동합니다. 당신이 자동 생성 된 ID를 사용하는 경우 그러나, 롤백 된 삽입에 순서에 차이가 될 가능성이있다.

    당신이 간격이있는 경우이 방법은 작동합니다

    declare @temp (value int, primaryKey int, tempid int identity)
    insert value, primarykey from mytable order by  primarykey
    
    select t1.value - t2.value from @temp  t1
    join @temp  t2 
    on t1.tempid = t2.tempid - 1
    
  8. from https://stackoverflow.com/questions/710212/is-there-a-way-to-access-the-previous-row-value-in-a-select-statement by cc-by-sa and MIT license