programing

다중 열 쿼리의 한 열에 고유한 값을 가져오는 Oracle 11g SQL

abcjava 2023. 6. 10. 07:54
반응형

다중 열 쿼리의 한 열에 고유한 값을 가져오는 Oracle 11g SQL

사람들의 A, 그들의 모국어, 그리고 다른 열 C3이 주어집니다.C10은 ...로 표시됩니다.

표 A

사용자 언어...
단발 영어존 잉글리쉬블라드 러시안올가 러시아인호세 스페인어

각 고유 언어에 대해 한 행의 모든 열을 선택하는 쿼리를 구성하려면 어떻게 해야 합니까?

원하는 결과

사용자 언어...
단발 영어블라드 러시안호세 스페인어

각각의 다른 언어의 어떤 행이 결과를 낳는지는 저에게 중요하지 않습니다.위의 결과에서 저는 각 언어의 가장 낮은 행 번호를 선택했습니다.

Eric Petroelje는 거의 옳습니다.

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

참고: ROWNUM이 아닌 ROWID(행 고유 ID) 사용(결과 집합 내의 행 번호 제공)

이를 통해 보다 효율적으로 값을 선택하는 데 사용되는 순서를 제어할 수 있습니다.

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;

각 언어에 대해 어떤 사람이 선택되었는지 정말 상관하지 않는 경우 ORDER BY 절을 생략할 수 있습니다.

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;

Oracle이 약간 녹슬었지만, 이 방법이 효과가 있을 것 같습니다.

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

하위 선택에서 RANK() 기능을 사용한 다음 순위 = 1인 행을 당기면 됩니다.

select person, language
from
( 
    select person, language, rank() over(order by language) as rank
    from table A
    group by person, language
)
where rank = 1

효율성을 위해 하퍼처럼 데이터를 한 번만 기록하려고 합니다.그러나 순위()를 사용하지 않으려는 이유는 순위()가 동점을 제공하고 언어별 순서가 아닌 언어별로 그룹화하기를 원하기 때문입니다.여기서 행을 구분하기 위해 절별로 순서를 추가하지만 실제로 데이터를 정렬하지는 않습니다.이를 위해 "null에 의한 주문" 등을 사용합니다.

count(*) over(null을 기준으로 언어순으로 그룹화)

select person, language     
from table A     
group by person, language  

고유 행을 반환합니다.

언급URL : https://stackoverflow.com/questions/983202/oracle-11g-sql-to-get-unique-values-in-one-column-of-a-multi-column-query

반응형