[postgresql] Postgres : 고유하지만 단 하나의 열

pgsql에 이름이있는 테이블이 있지만 (1 mio. 행 이상) 중복 항목도 많습니다. 내가 3 개 필드를 선택 : id, name, metadata.

나는 무작위로를 선택합니다 ORDER BY RANDOM()그리고 LIMIT 1000나는이 내 PHP 스크립트에 약간의 메모리를 절약하기 위해 여러 단계이다 할 수 있도록.

하지만 어떻게하면 이름이 중복되지 않는 목록 만 제공됩니다.

예를 들어 [1,"Michael Fox","2003-03-03,34,M,4545"]는 반환되지만 [2,"Michael Fox","1989-02-23,M,5633"]. 이름 필드는 가장 중요하며 선택을 할 때마다 목록에서 고유해야하며 무작위 여야합니다.

나는 GROUP BY name, bu로 시도한 다음 나에게 ID와 메타 데이터가 GROUP BY있거나 통합 기능에 있을 것으로 기대 하지만 어떻게 든 필터링하고 싶지 않습니다.

누구나 많은 열을 가져 오는 방법을 알고 있지만 하나의 열에서만 구별합니까?



답변

하나 (또는 ​​n) 열에서만 구별을 수행하려면 다음을 수행하십시오.

select distinct on (name)
    name, col1, col2
from names

그러면 이름이 포함 된 모든 행이 반환됩니다. 반환 될 행을 제어하려면 다음을 주문해야합니다.

select distinct on (name)
    name, col1, col2
from names
order by name, col1

col1에 의해 주문되면 첫 번째 행을 반환합니다.

distinct on:

SELECT DISTINCT ON (expression [, …])는 주어진 표현식이 동일하다고 평가되는 각 행 집합의 첫 번째 행만 유지합니다. DISTINCT ON 표현식은 ORDER BY와 동일한 규칙을 사용하여 해석됩니다 (위 참조). 원하는 행이 먼저 표시되도록 ORDER BY를 사용하지 않는 한 각 집합의 “첫 번째 행”은 예측할 수 없습니다.

DISTINCT ON 식은 가장 왼쪽의 ORDER BY 식과 일치해야합니다. ORDER BY 절에는 일반적으로 각 DISTINCT ON 그룹 내에서 원하는 행의 우선 순위를 결정하는 추가식이 포함됩니다.


답변

누구나 많은 열을 가져 오는 방법을 알고 있지만 하나의 열에서만 구별합니까?

당신 DISTINCT ON조항을 원합니다 .

샘플 데이터 나 전체 쿼리를 제공하지 않았으므로 보여 드릴 내용이 없습니다. 다음과 같이 작성하고 싶습니다.

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;

이는 예측할 수없는 ( “무작위”가 아닌) 행 집합을 반환합니다. 예측 가능하게 만들고 싶다면 ORDER BYClodaldo의 답변을 추가하십시오 . 진정으로 무작위로 만들고 싶다면 ORDER BY random().


답변

SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA
from SOMETABLE
GROUP BY NAME


답변