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
, но тогда он ожидает, что у меня есть идентификатор и метаданные в GROUP BY
так же, как и в расширенной функции, но я не хочу их как-то фильтровать.
Кто-нибудь знает, как получить много столбцов, но сделать только один столбец?
3 ответа
Чтобы различить только один (или 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.
Кто-нибудь знает, как получить много столбцов, но сделать только один столбец?
Вы хотите DISTINCT ON
оговорка
Вы не предоставили пример данных или полный запрос, поэтому мне нечего вам показать. Вы хотите написать что-то вроде:
SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;
Это вернет непредсказуемый (но не "случайный") набор строк. Если вы хотите, чтобы это было предсказуемо, добавьте ORDER BY
за ответ Клодальдо. Если вы хотите сделать это действительно случайным, вы захотите ORDER BY random()
,
Чтобы сделать различное по n столбцам:
select distinct on (col1, col2) col1, col2, col3, col4 from names
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA
from SOMETABLE
GROUP BY NAME