Поиск неправильных повторяющихся данных в sql

Привет, я недавно начал работать инженером-программистом, поэтому этот вопрос может быть слишком глупым, но, пожалуйста, потерпите меня.

У меня три колонки, скажем фрукты, цвет, вкус.

Фрукты могут иметь разные цвета и вкусы. Но один фрукт определенного цвета должен иметь такой же вкус. Например, (яблочный, красный) должен иметь только один вкус. (яблоко, красное, кислое) и (яблочное, красное, сладкое) не могут существовать вместе.

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

Извините за такое ужасное описание, но если бы кто-нибудь мог понять и помочь мне, я был бы очень признателен.

Не могли бы вы опубликовать примеры ваших таблиц и запросов, которые вы пробовали?

slasky 01.05.2018 21:27

Привет и добро пожаловать в SO. Ответ, который вы ищете, можно найти здесь. spaghettidba.com/2015/04/24/…

Sean Lange 01.05.2018 21:27

Пример вопроса: stackoverflow.com/q/50008226/6327676

DxTx 01.05.2018 21:29

«Я пробовал разные соединения» ... зачем вам пробовать соединения, если у вас есть только одна таблица с тремя столбцами? Что-то мне подсказывает, что вы упускаете важные детали из своего вопроса.

Tab Alleman 01.05.2018 21:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Использовать функцию row_number()

select * from (select *,
                    row_number() over (partition by fruit, taste order by fruit) Seq 
               from table t) t 
where Seq > 1;

Таким образом, вы нашли Seq nos> 1, если фрукты имеют повторяющийся вкус, и вы можете отфильтровать их и удалить, используя subquery со статусом delete.

delete t 
from  (select *,
           row_number() over (partition by fruit, taste order by fruit) Seq 
       from table t) t
where Seq > 1;
Ответ принят как подходящий

Чтобы найти фрукты одного цвета на разные вкусы:

select  fruit
from    fruit
group by
        fruit
,       color
having  count(distinct taste) > 1

Чтобы перечислить все строки, относящиеся к этим фруктам:

select  *
from    (
        select  count(*) over (partition by fruit, color) cnt
        ,       *
        from    fruits
        group by
                fruit
        ,       color
        ,       taste
        ) sub
where   cnt > 1

Рабочий пример на SQL Fiddle.

Группировать по второму не обязательно, и я уже опубликовал правильный синтаксис

paparazzo 01.05.2018 21:45

@paparazzo: group by помогает, когда есть несколько рядов с одинаковыми фруктами, цветом и вкусом. Попробуйте использовать связанный скрипт SQL Fiddle

Andomar 01.05.2018 21:46

Я подозреваю, что если есть несколько OP, то я бы хотел их увидеть.

paparazzo 01.05.2018 21:47

Установите ПК или уникальное ограничение на фрукты, цвет

select * 
from (select *, count(*) over (partition by fruit, color) as cnt 
      from table 
     ) t 
where t.cnt > 1 
order by fruit, color

Другие вопросы по теме