id class count day
1 2 5 5
2 2 4 5
3 2 4 5
3 2 4 5
4 2 5 3
4 1 5 3
4 2 5 3
Поэтому у меня есть запрос на поиск всех дубликатов на основе нескольких столбцов, однако это также возвращает id, где не все записи дублируются. В приведенном выше примере запрос должен показывать только /count id 3, так как все записи с id 3 дублируются. Хотя идентификатор 4 также имеет дубликат, он не должен отображаться, поскольку он имеет уникальную уникальную запись.
есть идеи как это сделать?
Если вам нужны строки с id
где нет строки с одинаковым id
и уникальными значениями строк, используйте NOT IN
и HAVING
select *
from your_table t1
where t1.id not in(
select id
from your_table
group by id, class, count, day
having count(*) = 1
)
Вы можете использовать этот запрос: http://sqlfiddle.com/#!9/1a2536/8
select id
from test
group by id
having count(distinct id,class,count,day) = 1 and count(*)>1
вы группируете каждую строку по id и подсчитываете, сколько разных строк имеет группа, если отдельная сумма равна 1, а общая строка → 1, для этого идентификатора есть только повторяющиеся строки.
Я придумал это:
SELECT *
FROM (SELECT id,
Count(id) AS matched
FROM test
GROUP BY id,
class,
count,
day) t
GROUP BY id , matched
HAVING Count(id) = 1
AND matched >= 2
Возможно, более эффективный способ сделать это, но это проще понять, сначала мы группируем каждый столбец, чтобы найти дубликаты данных. Тогда первая часть этого элемента исключает записи, которые на самом деле имеют разные варианты по id, а затем мы сохраняем только строки, которые на самом деле имеют только дубликаты.
Изменение: совместим с режимом "only_full_group_by"
Это довольно просто, быстро заметите, что очень плохая идея назвать количество столбцов:
SELECT id, class, 'count',day, COUNT(*)
FROM myTable
GROUP BY id, class, 'count',day
HAVING COUNT(*) > 1
edit: Я неправильно понял вопрос, так вот мое решение:
SELECT test.id, test.class, test.count, test.day , count(*), t.countID
FROM (SELECT id, Count(id) AS countID FROM test GROUP BY id ) t
INNER JOIN test on t.id = test.id
GROUP BY test.id, test.class, test.count, test.day
HAVING Count(*) > 1 AND t.countID = count(*)