#sql
#sql
Вопрос:
Представьте, что у меня есть набор данных, который выглядит следующим образом
C1 | C2 | C3 | C4 | C5
1 NA NA NA 34
2 NA NA NA 39
3 NA NA NA 29
4 NA NA NA 17
5 NA NA NA 17
6 NA NA NA 34
Если я хочу вернуть только те строки, где в C5 существуют дубликаты, как мне это сделать? Поэтому я бы хотел, чтобы строки 1 и 6, а также 4 и 5.
Комментарии:
1. На какую базу данных вы ссылаетесь?
Ответ №1:
Простой метод exists
:
select t.*
from t
where exists (select 1 from t t2 where t2.c5 = t.ct and t2.c1 <> t.c1);
Вы также можете использовать оконные функции:
select t.*
from (select t.*, count(*) over (partition by c5) as cnt
from t
) t
where cnt >= 2;
Комментарии:
1. Если таблица t является результатом нескольких объединений таблиц, как мне включить эту логику? Похоже, SQL не нравится предложение where exist, когда у меня смешаны соединения
2. @j_nj . , , вы можете определить
t
с помощью CTE с любым запросом. Или просто используйте вторую версию.3. я никогда не использовал CTE, не могли бы вы помочь объяснить это? Также моя текущая версия MySQL не может запускать функции Windows, и я пока не могу обновиться, так что, к сожалению, на данный момент это невозможно
4.
with t as (<your query here>) select . . .