한 열과 다른 열에서 구별을 선택하는 방법은 무엇입니까?


29

한 열의 모든 고유 값을 찾으려면 SQL 데이터베이스를 쿼리해야하며 다른 열의 임의 값이 필요합니다. 예를 들어, 키와 값이라는 두 개의 열이있는 다음 표를 고려하십시오.

key     value
===     =====
one     test
one     another
one     value
two     goes
two     here
two     also
three   example

각 개별 키에서 임의로 선택한 하나의 샘플 행을 다시 가져 와서 다음 세 행을 가져오고 싶습니다.

key     value
===     =====
one     test
two     goes
three   example

SQL에서 이러한 쿼리를 공식화하려면 어떻게해야합니까?


2
어떤 DBMS (Oracle, SQL-Server, DB2, MySQL, Postgres)?
ypercubeᵀᴹ

1
독점 시스템입니다.
WilliamKF

답변:


33

작성하기 가장 쉬운 쿼리는 엄격한 ANSI 설정이 아닌 MySQL에 대한 것입니다. 비표준 구성을 사용합니다.

SELECT key, value
FROM tableX
GROUP BY key ;

엄격한 설정 ONLY_FULL_GROUP_BY이 기본값 인 최신 버전 (5.7 및 8.0+)에서는 ANY_VALUE()5.7에 추가 된 기능을 사용할 수 있습니다 .

SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;

Postgres, SQL-Server, Oracle, DB2와 같은 창 기능이있는 다른 DBMS의 경우 이와 같이 사용할 수 있습니다. 장점은 결과에서 다른 열을 선택할 수도 있다는 것입니다 ( keyvalue).

SELECT key, value
FROM tableX
    ( SELECT key, value,
             ROW_NUMBER() OVER (PARTITION BY key 
                                ORDER BY whatever)     --- ORDER BY NULL
               AS rn                                   --- for example
      FROM tableX
    ) tmp 
WHERE rn = 1 ;

위의 이전 버전과 다른 DBMS의 경우 거의 모든 곳에서 작동하는 일반적인 방법입니다. 이 방법으로는 다른 열을 선택할 수 없다는 단점이 있습니다. 또 같은 그 집계 함수입니다 MIN()MAX()(비트, 텍스트, 모양 같은) 일부의 DBMS에서 일부 데이터 유형과 일을하지 :

SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;

PostgreSQL에는 사용할 수있는 특수한 비표준 DISTINCT ON연산자가 있습니다. 선택 사항 ORDER BY은 모든 그룹에서 어떤 행을 선택해야하는지 선택하는 것입니다.

SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;

2
@WilliamKF "임의로 선택"이라는 말이 "임의로 선택됨"을 의미하는 경우 ORDER BY whateverypercube의 쿼리를 결과를 랜덤 화하는 함수에 대한 호출로 바꾸십시오 .
레이 리펠

1
@LeighRiffel 처음 접하는 것만 큼 간단하고 임의의 선택은 필요하지 않습니다.
WilliamKF

3

MS-SQl 서버의 경우 :

;with FinalDataset as
(
    select *,
        row_number() over(partition by key order by value) as rownum
    from YourOriginalTable
)
select
   key,
   value
from FinalDataset 
where rownum = 1

마찬가지로 두 번째 결과 집합에 대해 rownum = 2를 가질 수 있습니다


2

허용되는 답변과 비슷하지만 min () 또는 max () 대신 array_agg ()

SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;

선택적으로 배열 내에서 값을 정렬하여 가장 큰 값 또는 가장 작은 값을 선택할 수 있습니다.

SELECT key, (array_agg(value) ORDER BY value DESC)[1] AS value
FROM tableX
GROUP BY key ;

(PostgreSQL에서 확인)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.