[SQL] SELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요?
SQLSELECT 문에서 "이전 행"값에 액세스 할 수있는 방법이 있나요?
나는 테이블의 두 줄 사이에 열의 차이를 계산해야합니다. 나는 SQL이 직접 할 수있는 방법이 있습니까? 나는 마이크로 소프트 SQL 서버 2008을 사용하고 있습니다.
나는 이런 식으로 뭔가를 찾고 있어요 :
SELECT value - (previous.value) FROM table
은 "이전"변수 참조 최신 선택한 행 것을 상상. A를 물론 실제로 내가 필요 정확히 무엇이며, 내가 N-1 행 N있는 테이블에서 선택된 행하는 아마 아니다으로 끝날 것 같은 선택합니다.
그 어떤 방법으로 할 수 있습니까?
해결법
-
==============================
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.지연 기능을 사용 :
지연 기능을 사용 :
SELECT value - lag(value) OVER (ORDER BY Id) FROM table
ID-1은 항상 일을하지 않도록, 값을 건너 뛸 수 있습니다 IDS에 사용되는 시퀀스.
-
==============================
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.
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.(가) 테이블의 합류 버전에 일치하는 행이 "이전"의 특정 정의, 하나 개의 행 이전 그래서 조건이 밖으로 일에 참여 왼쪽은, 그 자체로 테이블에 가입하세요.
(가) 테이블의 합류 버전에 일치하는 행이 "이전"의 특정 정의, 하나 개의 행 이전 그래서 조건이 밖으로 일에 참여 왼쪽은, 그 자체로 테이블에 가입하세요.
업데이트 : 처음 엔에서 당신이 더 이전 행 없었다 조건에 대한 null로, 모든 행을 유지하려는 것이라고 생각했다. 당신이 내부 오히려 왼쪽보다는 가입에 가입해야합니다, 그래서 다시 그냥, 그 행이 추려 원하는 그것을 읽기.
최신 정보:
는 SQL 서버의 최신 버전은 또한 LAG가 너무,이에 사용할 수있는 윈도 윙 기능을지도한다.
-
==============================
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.순서에는 차이가없는 경우 선택한 답변에만 작동합니다. 당신이 자동 생성 된 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
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
'SQL' 카테고리의 다른 글
[SQL] 내가 어떻게 LIKE 연산자에서 여러 조건을 도입 할 수 있습니다 (0) | 2020.03.27 |
---|---|
[SQL] 어떻게 열 필드에 두 행의 차이를 얻으려면? (0) | 2020.03.27 |
[SQL] SQL Server 인덱스 - 오름차순 또는 내림차순, 어떤 차이가 확인합니까? (0) | 2020.03.27 |
[SQL] 어떻게 Laravel 쿼리 빌더를 사용하여 하위 쿼리에서 선택? (0) | 2020.03.27 |
[SQL] 최대 절전 모드 연합 대안 (0) | 2020.03.27 |