Найти дубликаты, где записи внутри идентификатора являются дубликатами

0
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 также имеет дубликат, он не должен отображаться, поскольку он имеет уникальную уникальную запись.

есть идеи как это сделать?

  • 4
    Укажите также ожидаемый результат (в виде таблицы). И покажите нам свою текущую попытку запроса.
  • 1
    Будем рады вашим отзывам;)
Теги:

4 ответа

1
Лучший ответ

Если вам нужны строки с 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
)
  • 0
    Спасибо, этот сделал то, что я хотел. :)
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, для этого идентификатора есть только повторяющиеся строки.

-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"

  • 0
    этот ответ работает, и я первым дал его, хотя, возможно, он не был оптимальным, я не думаю, что он заслуживает отрицательного ответа ... не в первый раз, когда это происходит. Люди на самом деле опровергают другие ответы, чтобы их приняли, или что-то? очень хорошее и ободряющее сообщество здесь.
  • 0
    Каждый получает странные отрицательные отзывы здесь без объяснения причин. Я думаю, это просто из-за большой аудитории. Однако, если вы хотите помочь другим людям, никто не сможет вас остановить :)
Показать ещё 5 комментариев
-2

Это довольно просто, быстро заметите, что очень плохая идея назвать количество столбцов:

    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(*)
  • 0
    этот запрос возвращает идентификатор 4, который не имеет полностью повторяющихся строк
  • 0
    Я отредактировал свой запрос, пожалуйста, скажите нам, если это то, что вы хотите

Ещё вопросы

Сообщество Overcoder
Наверх
Меню