2017-09-11 1 views
1

데이터의 고유 한 그룹에 임의의 "기본 키"를 첨부하는 방법으로 Oracle에서 DENSE_RANK() 함수를 사용하려고합니다. 내 데이터 세트는 지난 며칠 동안 다른 "자산"에 대해 수행 된 다른 "위치"의 거래 목록입니다. 데이터 세트는 ASSET ASC, DATE ASC에 의해 사전 정렬됩니다 (아래 참조).Oracle DENSE_RANK()


ASSET  LOCATION  DATE 
A   LOC_A  9/1/2017 
A   LOC_A  9/1/2017 
A   LOC_B  9/5/2017 
A   LOC_B  9/7/2017 
A   LOC_A  9/11/2017 
B   LOC_A  8/22/2017 
B   LOC_C  8/25/2017 
B   LOC_C  8/26/2017 
B   LOC_A  9/2/2017 
B   LOC_A  9/3/2017 

나는 (자산, 위치에 따라 ORDER) OVER DENSE_RANK()를 사용하면, 다음과 같은 출력을 얻을 : 그러나


ASSET  LOCATION  DATE  ACTUAL 
A   LOC_A  9/1/2017  1 
A   LOC_A  9/1/2017  1 
A   LOC_B  9/5/2017  2 
A   LOC_B  9/7/2017  2 
A   LOC_A  9/11/2017  1 
B   LOC_A  8/22/2017  3 
B   LOC_C  8/25/2017  4 
B   LOC_C  8/26/2017  4 
B   LOC_A  9/2/2017  3 
B   LOC_A  9/3/2017  3 

, 내가 값을 얻을 수있는 방법을 알아 내려고 노력하고있어를 여기에 나와있는 "예상 된"값 :


ASSET  LOCATION  DATE  ACTUAL  EXPECTED 
A   LOC_A  9/1/2017  1   1 
A   LOC_A  9/1/2017  1   1 
A   LOC_B  9/5/2017  2   2 
A   LOC_B  9/7/2017  2   2 
A   LOC_A  9/11/2017  1   3 
B   LOC_A  8/22/2017  3   4 
B   LOC_C  8/25/2017  4   5 
B   LOC_C  8/26/2017  4   5 
B   LOC_A  9/2/2017  3   6 
B   LOC_A  9/3/2017  3   6 

이 향해 노력에 어떤 도움을 크게 감상 할 수있다.


내 SQL은

SELECT ASSET, LOCATION, TXNDATE, 
     DENSE_RANK() OVER (ORDER BY ASSET, LOCATION) AS DENSERANK 
FROM TEMPTABLE 
ORDER BY ASSET, TXNDATE 

이며, 예, 나는 위의 "실제"결과를 얻고있다.

+0

그 결과를 얻지 않아야합니다. 'PARTITION BY'를 사용하지 않으시겠습니까? – Lamak

+0

My SQL은 ASSET, LOCATION, TXNDATE, DENSE_RANK() 이상 (ASDET, LOCATION 별 ORDER BY ASSET, LOCATION) ASSET, TXNDATE 및 YES로 DENSERANK에서 위의 "ACTUAL"결과를 얻습니다. – Nathan

답변

0

assetlocation의 변경 사항을 찾고 있습니다. 한 가지 방법은 lag() 사용하고 누적 합계 : RANGE BETWEEN보다는 ROWS BETWEEN

SELECT ASSET, LOCATION, TXNDATE, 
     SUM(CASE WHEN Asset = prev_asset AND location = prev_location THEN 0 
       ELSE 1 
      END) OVER (ORDER BY TXNDATE) AS DENSERANK 
FROM (SELECT tt.*, 
      LAG(ASSET) OVER (ORDER BY TXNDATE) as prev_asset, 
      LAG(LOCATION) OVER (ORDER BY TXNDATE) as prev_location 
     FROM TEMPTABLE 
    ) tt 
ORDER BY ASSET, TXNDATE; 

오라클 기본 설정됩니다. 같은 날짜의 행이 있고 모두 똑같이 처리해야하기 때문에 원하는 동작입니다.

+0

오라클 솔루션입니까? SQL을 그대로 사용하면 "UNBOUNDED AND CURRENT ROW 사이의 범위"절로 인해 구문 오류가 발생합니다. 범위에있는 데이터베이스는 Oracle 11g입니다. – Nathan

+0

Nevermind, UNBOUNDED AND CURRENT ROW 사이의 RANGE 절을 제거하면 쿼리가 정상적으로 작동하고 결과가 반환됩니다. 기대 한 값과 동일하지는 않지만 ASSET/LOCATION의 고유 한 값은 고유 한 값입니다. 이는 내가 찾고있는 값입니다. 고맙습니다! – Nathan

+0

@ Nathan. . . 어쨌든 Oracle에서는 RANGE BETWEEN이 기본값이므로 필요하지 않습니다. –

관련 문제