Найти, какие строки имеют разные значения для данного столбца в 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.

21
задан 04 дек. '12 в 20:07
источник поделиться
4 ответов

Присоединитесь к таблице с собой и дайте ей два разных псевдонима (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).

29
ответ дан 04 дек. '12 в 20:15
источник

Это работает для PL/SQL:

select count(*), id,address from table group by id,address having count(*)<2
4
ответ дан 04 дек. '12 в 20:18
источник

Вы можете сделать это, используя группу:

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
2
ответ дан 04 дек. '12 в 20:17
источник

Лично я печатаю их в файл с использованием Perl или Python в формате

<COL_NAME>:  <COL_VAL>

для каждой строки, чтобы файл имел столько строк, сколько есть столбцов. Затем я сделал бы diff между этими двумя файлами, предполагая, что вы находитесь в Unix или сравниваете их, используя некоторые эквивалентные утилиты в другой ОС. Если у вас несколько наборов записей (т.е. Несколько строк), я бы добавил к каждой строке файла, а затем в файле было бы NUM_DB_ROWS * NUM_COLS строк

0
ответ дан 04 дек. '12 в 20:14
источник

Другие вопросы по меткам или Задайте вопрос