Как получить строки из таблицы SQL, просто игнорируя строки, которые имеют повторяющиеся значения в одном конкретном столбце

# #sql #google-cloud-platform

Вопрос:

Я знаю, что если я хочу иметь значения distict в случае дубликатов, я могу использовать DISTINCT. Но я хочу, чтобы, если в одном из столбцов есть повторяющееся значение, мне не нужна никакая строка из этого .

напр..

ИДЕНТИФИКАТОР ЗАКАЗА Имя
ОРД1 Аарон
ОРД2 боб
ОРД3 Нести
ОРД1 Дэнни
ОРД2 Эмили
ОРД2 Откровенный

В этом случае я просто хочу, чтобы результат был таким:

ИДЕНТИФИКАТОР ЗАКАЗА Имя
ОРД3 Нести

Так как ОРД1 и ОРД3 повторяются.

Комментарии:

1. WHERE NOT EXISTS(...)

2. Я удалил несогласованные теги базы данных. Пожалуйста, отмечайте только ту базу данных, которую вы действительно используете.

Ответ №1:

Привет, я попробовал это, и это сработало для меня.

 SELECT Order_Id, MAX(Name) as Name FROM table GROUP BY Order_Id HAVING COUNT(*) = 1;
 

Ответ №2:

Вы можете использовать агрегацию с GROUP BY и указать условие для групп с HAVING :

 SELECT * FROM tbl
GROUP BY order_id
HAVING count(*) = 1;
 

Комментарии:

1. Будет работать только для повторяющихся значений order_id.

2. @стефан, select * выдает ошибку, которую я также должен сгруппировать по другим столбцам. Но я хочу предоставить все столбцы для внешнего запроса из этого. что-то вроде этого: выражение звездного расширения ссылается на столбец CORRELATION_ID, который не сгруппирован и не агрегирован

Ответ №3:

Лучшее, что я могу придумать, это:

 SELECT * FROM tbl
WHERE name NOT IN (SELECT name FROM tbl GROUP BY name HAVING count(name) > 1) AND order_id NOT IN (SELECT order_id FROM tbl GROUP BY order_id HAVING count(order_id) > 1)
 

Комментарии:

1. Не было бы разумнее просто сгруппировать по обоим столбцам в одном подзапросе? Несмотря на это, у меня не складывается впечатления, что это имя имеет отношение к этому делу.

2. Если я сгруппирую по обоим столбцам, строки типа (ORD1, «Джек») и (ORD2, «Джек») или строки типа (ORD1, «Джек») и (ORD1, «Джилл») не будут отфильтрованы (в зависимости от того, в каком порядке вы группируетесь). И вопрос звучит так: «Но я хочу, чтобы, если в одном из столбцов есть повторяющееся значение, мне не нужна никакая строка из этого». Там довольно конкретно говорится о том, что обе колонки имеют отношение к делу.

3. Конечно, это был глупый комментарий о группировке. Но другой момент был законным: существует ровно одна конкретная колонка, имеющая отношение к делу, а не какая- либо из нескольких.

Ответ №4:

NOT EXISTS это типичный подход:

 select t.*
from t
where not exists (select 1 from t t2 where t2.order_id = t.order_id and t2.name <> t.name);