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

#sql #excel #amazon-redshift

Вопрос:

Я пытаюсь написать запрос, который предоставит мне идентификаторы, когда они дублируются (вызваны разными значениями типов), а значения кода НЕ совпадают в дублированных строках. Возможны только 2 значения типа, поэтому всегда будет только 2 дубликата.

Например:

ID Тип Код
ИДЕНТИФИКАТОР 1 Тип 1 #####
ИДЕНТИФИКАТОР 1 Тип 2 #####
ИДЕНТИФИКАТОР 2 Тип 1 #####
ИДЕНТИФИКАТОР 2 Тип 2 $$$$$

Мои желаемые данные не будут включать идентификатор 1, так как его коды совпадают.

Я не уверен в синтаксисе и логике, необходимых для возврата только идентификаторов, коды которых не совпадают, например, ID 2 в моем примере. Я также не буду включать столбец » Тип «в окончательный отчет, поскольку требуемая информация содержится в столбце «Идентификатор». Я использую DISTINCT, так как мне тоже не нужна повторяющаяся строка. Один идентификатор в полном порядке, если его невидимый партнер имеет другой код. Вот основа моего запроса:

 SELECT DISTINCT id, code FROM table WHERE id LIKE 'ID%' AND  

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

Я также открыт для альтернативных предложений, таких как «просто сделайте это в Excel после того, как соберете ВСЕ данные — это будет быстрее», но вам придется объясниться 😉 Спасибо!

Ответ №1:

Агрегируйте по идентификатору и проверьте, получаете ли вы более одного кода (сравнивая min и max или подсчитывая различные):

 select id, min(code), max(code) from mytable group by id having min(code) lt;gt; max(code) order by id;  

Ответ №2:

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

 with temp as(  Select   ID,   rank() over (partition by ID order by code) as rn   from table_name)  select ID from temp where rn = 2