복붙노트

[SQL] 오라클 포스트 그레스 'DISTINCT ON의 동등한?

SQL

오라클 포스트 그레스 'DISTINCT ON의 동등한?

포스트 그레스에서는 DISTINCT ON와 그룹의 첫 번째 값을 조회 할 수 있습니다. 어떻게 오라클 달성 될 수 있는가?

포스트그레스 매뉴얼에서 :

예를 들어, 주어진 테이블 :

 col1 | col2 
------+------
 A    | AB
 A    | AD
 A    | BC
 B    | AN
 B    | BA
 C    | AC
 C    | CC

오름차순 정렬 :

> select distinct on(col1) col1, col2 from tmp order by col1, col2 asc;
 col1 | col2 
------+------
 A    | AB
 B    | AN
 C    | AC

내림차순 정렬 :

> select distinct on(col1) col1, col2 from tmp order by col1, col2 desc;
 col1 | col2 
------+------
 A    | BC
 B    | BA
 C    | CC

해결법

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

    1.동일한 효과는 오라클 어느 FIRST_VALUE () 함수를 사용하거나 랭크 () 또는 ROW_NUMBER () 함수를 이용하여 복제 될 수있다.

    동일한 효과는 오라클 어느 FIRST_VALUE () 함수를 사용하거나 랭크 () 또는 ROW_NUMBER () 함수를 이용하여 복제 될 수있다.

    모두 포스트 그레스도 작업을 변형.

    FIRST_VALUE ()

    select distinct col1, 
    first_value(col2) over (partition by col1 order by col2 asc)
    from tmp
    

    는 각 파티션에 대해 하나의 행을 얻기 위해 별개로 조합하여 사용하는 것이 필요하므로 FIRST_VALUE은, 각 행의 첫 번째 파티션의 값하지만 반복을 제공한다.

    ROW_NUMBER () / 순위 ()

    select col1, col2 from (
      select col1, col2, 
      row_number() over (partition by col1 order by col2 asc) as rownumber 
      from tmp
    ) foo
    where rownumber = 1
    

    본 예에서는 순위를 ROW_NUMBER () 교체하면 동일한 결과를 산출한다.

    이러한 변형의 특징은 간단히 = 1로 ROWNUMBER <= N. ROWNUMBER을 변경하여가 (예를 들어 "마지막 3 업데이트") 특정 파티션에 대한 제 N 열을 인출하는 데 사용될 수 있다는

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

    2.두 개 이상의 필드가있는 경우 다음 beerbajays이 (DESC 순서 주) 하위 쿼리로 대답 사용

    두 개 이상의 필드가있는 경우 다음 beerbajays이 (DESC 순서 주) 하위 쿼리로 대답 사용

    select col1,col2, col3,col4 from tmp where col2 in
    (
    select distinct 
    first_value(col2) over (partition by col1 order by col2 DESC) as col2
    from  tmp
    --WHERE you decide conditions
    )
    
  3. from https://stackoverflow.com/questions/10515391/oracle-equivalent-of-postgres-distinct-on by cc-by-sa and MIT license