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에 의해 주문되면 첫 번째 행을 반환합니다.
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 BY
Clodaldo의 답변을 추가하십시오 . 진정으로 무작위로 만들고 싶다면 ORDER BY random()
.
답변
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA
from SOMETABLE
GROUP BY NAME