Postgres: отличается, но только для одного столбца

У меня есть таблица на pgsql с именами (более 1 млн. строк), но у меня также много дубликатов. Я выбираю 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, а также или в функции aggragate, но я не хочу, чтобы они каким-то образом фильтровались.

Кто-нибудь знает, как извлекать много столбцов, но делать только отдельные столбцы?

Ответ 1

Сделать отдельный на одном (или 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 (выражение [,...]) сохраняет только первую строку каждого набора строк, где эти выражения оцениваются равными. Выражения DISTINCT ON интерпретируются с использованием тех же правил, что и для ORDER BY (см. Выше). Обратите внимание, что "первая строка" каждого набора непредсказуема, если только ORDER BY не используется, чтобы убедиться, что первая строка отображается первой.

Выражение DISTINCT ON должно соответствовать крайнему левому выражению ORDER BY. Предложение ORDER BY обычно содержит дополнительные выражения (выражения), которые определяют желаемый приоритет строк в каждой группе DISTINCT ON.

Ответ 2

Кто-нибудь знает, как извлекать много столбцов, но делать только отдельные столбцы?

Вы хотите предложение DISTINCT ON.

Вы не предоставили образцы данных или полный запрос, чтобы у меня не было ничего, чтобы показать вам. Вы хотите написать что-то вроде:

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

Это вернет непредсказуемый (но не "случайный" ) набор строк. Если вы хотите сделать его предсказуемым, добавьте ORDER BY за ответ Clodaldo. Если вы хотите сделать это по-настоящему случайным, вам нужно ORDER BY random().

Ответ 3

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