2014-09-04 4 views
0

나는 3 개의 필드가있는 테이블을 가지고 있습니다. 즉, 내가 달성하기 위해 ... 가능하다면 ... 단일 쿼리 (얼마나 많은 하위 쿼리 상관없이)하지만, 일반 SQL과 함께하고 싶은 무엇 (피벗없이, CTE 등) 얻기 위해 같은 이전 행/다음 행에서 값 가져 오기 SQL

id, transferdate, placeid 
--------------------------- 
1 | 1-4-2014 | 14 
2 | 4-4-2014 | 14 
5 | 10-4-2014| 14 
6 | 1-5-2013 | 13 
9 | 10-6-2013| 12 

입니다

: 각 행에서 placeid의 이전 날짜가 이전 행의 또는 다음 행인 으로 변경되어 일부 계산이 가능합니다. 말 : 내가 임시 테이블을 사용하는 경우에도 저장 프로 시저 또는 함수 또는 커서 그것을 달성 한

id, transferdate, placeid, nexttransferdate 
    -------------------------------------------- 
    1 | 1-4-2014 | 14  | 4-4-2014   
    2 | 4-4-2014 | 14  | 10-4-2014 
    5 | 10-4-2014| 14  | null (or transferdate) 
    6 | 1-5-2013 | 13  | null (or transferdate) 
    9 | 10-6-2013| 12  | null (or transferdate) 

내가 내장 재귀 함수 (즉, 오라클)와 함께 작업을 수행하는 방법을 알고 있지만 내 문제가 있다는 것입니다 나는 하나의 명령문으로 일반 SQL 코드 여야하므로 보고서 SQL 문에서 하위 쿼리로 사용해야합니다.

이전 행으로 보는 당신의 대답

+0

질문에 해당하지 않는 태그를 사용하지 마십시오. –

+0

그래서 그것은 불가 지론 일 필요는 없습니까? 당신은 태그가 있지만 그런 당신의 설명은 SQL 서버에있다. 그것은 버전을 실행하는 SQL 서버라고 가정? 그리고 보고서에서 cte를 사용할 수 있습니다. –

+0

@SeanLange : OP가 여러 번 언급했기 때문에 나는 그것을 '데이터베이스에 무관심하다'라고 태그했습니다. 그가 어떤 종류의 _report_를 언급하고 있는지 알 수 없습니다. –

답변

2

표준 SQL 기능을 주셔서 감사 것은 LAG하고 나중에 행으로 보는 것은 LEAD입니다. 그들은 모든 dbms에서 사용할 수 없습니다. 사용할 수 있는지 여부를 확인하십시오.

그렇지 않은 경우 : 다음 값은 항상 더 큰 값의 최소값이며, 이전 값은 더 작은 모든 값의 최대 값입니다. 이렇게하면 쿼리를 작성하는 데 도움이됩니다.

편집 :

select 
    id, 
    transferdate, 
    placeid, 
    (
    select min(transferdate) 
    from transfers latertransfers 
    where latertransfers.placeid = transfers.placeid 
    and latertransfers.transferdate > transfers.transferdate 
) as nexttransferdate 
from transfers 
order by id; 

편집 : 여기 당신을 위해 LEAD없이 간단한 쿼리가 여기에 LEAD 버전입니다. 버전 8.1.6부터 Oracle에서 사용할 수 있습니다.

select 
    id, 
    transferdate, 
    placeid, 
    lead(transferdate) over (partition by placeid order by transferdate) as nexttransferdate 
from transfers 
order by id; 
+0

답변 해 주셔서 감사합니다. [link] (@GordonLinoff)와 동일하게 작동하지만 질의 계획은 귀하의 실행 속도가 더 빠름을 보여줍니다. – ckinfos

+0

LEAD 쿼리도 추가했습니다. 이는이를 수행하는 직접적인 방법이며 최선의 실행 계획을 수립해야합니다. –

1

당신이 할 수있는 자체 조인 및 집계 : 말했다

select t.id, t.transferdate, t.placeid, min(t.transferdate) 
from table t left join 
    table tnext 
    on tnext.placeid = t.placeid and tnext.transferdate > t.transferdate 
group by t.id, t.transferdate, t.placeid; 

, 나는이 쿼리를 사용하여 실제로 권하고 싶지 않다. 사실상 모든 데이터베이스에는 더 나은 접근 방법이 있습니다.

+0

필자가 필요로하는 것은 잘 작동하지만 u 언급에서 분명히 이상한 쿼리 계획을 수행합니다. 케트 너의 질문에 답을 해줘야 해. 어쨌든 감사합니다. – ckinfos