Найти, какие строки имеют разные значения для данного столбца в Teradata SQL
Я пытаюсь сравнить два адреса из одного ID, чтобы узнать, совпадают ли они. Например:
Id Adress Code Address
1 1 123 Main
1 2 123 Main
2 1 456 Wall
2 2 456 Wall
3 1 789 Right
3 2 100 Left
Я просто пытаюсь выяснить, соответствует ли адрес для каждого ID. Поэтому в этом случае я хочу вернуть только ID 3 как имеющий другой адрес для Адресного кода 1 и 2.
Ответы
Ответ 1
Присоединитесь к таблице с собой и дайте ей два разных псевдонима (A
и B
в следующем примере). Это позволяет сравнивать разные строки одной таблицы.
SELECT DISTINCT A.Id
FROM
Address A
INNER JOIN Address B
ON A.Id = B.Id AND A.[Adress Code] < B.[Adress Code]
WHERE
A.Address <> B.Address
"Меньше" сравнения <
гарантирует, что вы получите 2 разных адреса, и вы не получите одинаковые 2 адресных кода дважды. Используя вместо этого "не равный" <>
, коды будут соответствовать (1, 2) и (2, 1); каждый из них для псевдонимов A
и B
по очереди.
Предложение join отвечает за сопряжение строк, где в where-clause проверяются дополнительные условия.
ОБНОВЛЕНИЕ:
Запрос выше работает с любыми кодами адресов. Если вы хотите сравнивать адреса с конкретными адресными кодами, вы можете изменить запрос на
SELECT A.Id
FROM
Address A
INNER JOIN Address B
ON A.Id = B.Id
WHERE
A.[Adress Code] = 1 AND
B.[Adress Code] = 2 AND
A.Address <> B.Address
Я полагаю, что было бы полезно найти клиентов, имеющих адрес фактурирования (Код адреса = 1 в качестве примера), отличающийся от адреса доставки (Код адреса = 2).
Ответ 2
Это работает для PL/SQL:
select count(*), id,address from table group by id,address having count(*)<2
Ответ 3
Вы можете сделать это, используя группу:
select id, addressCode
from t
group by id, addressCode
having min(address) <> max(address)
Другой способ записи может показаться яснее, но не работает:
select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1
Ответ 4
Лично я печатаю их в файл с использованием Perl или Python в формате
<COL_NAME>: <COL_VAL>
для каждой строки, чтобы файл имел столько строк, сколько есть столбцов. Затем я сделал бы diff
между этими двумя файлами, предполагая, что вы находитесь в Unix или сравниваете их, используя некоторые эквивалентные утилиты в другой ОС. Если у вас несколько наборов записей (т.е. Несколько строк), я бы добавил к каждой строке файла, а затем в файле было бы NUM_DB_ROWS * NUM_COLS строк