Procurar quais as linhas que têm valores diferentes para uma dada coluna na Teradata SQL
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
Só estou a tentar descobrir se a morada de cada identificação corresponde. Então, neste caso, eu quero retornar apenas ID 3 como tendo um endereço diferente para os códigos de Endereço 1 e 2.
4 answers
Junta-te à tabela e dá-lhe dois pseudónimos diferentes (A
e B
no exemplo seguinte). Isto permite comparar diferentes linhas da mesma tabela.
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
A comparação "menos do que" <
garante que você recebe 2 endereços diferentes e você não recebe os mesmos 2 códigos de endereço duas vezes. Usando "not equal" <>
em vez disso, daria os códigos como (1, 2) e (2, 1); cada um deles para o A
alias e o B
alias por sua vez.
A cláusula de adesão é responsável pelo emparelhamento das linhas em que, como a cláusula "onde", testa condições adicionais.
A consulta acima funciona com qualquer código de endereço. Se quiser comparar endereços com códigos de endereços específicos, poderá alterar a pesquisa para
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
Imagino que isto possa ser útil para encontrar clientes com um endereço de facturação (código de Endereço = 1 como exemplo) diferente do endereço de entrega (código de Endereço = 2) .
Isto funciona para PL / SQL:
select count(*), id,address from table group by id,address having count(*)<2
Pode fazer isto usando um grupo por:
select id, addressCode
from t
group by id, addressCode
having min(address) <> max(address)
Outra maneira de escrever isto pode parecer mais clara, mas não funciona tão bem:
select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1
Pessoalmente, eu imprimi-los-ia a um ficheiro usando Perl ou Python no formato
<COL_NAME>: <COL_VAL>
Para cada linha de modo a que o ficheiro tenha tantas linhas quantas as colunas. Em seguida, eu faria um diff
entre os dois arquivos, assumindo que você está no Unix ou compará-los usando uma utilidade equivalente em outro SO. Se tiver vários conjuntos de registos (isto é, mais do que uma linha), eu iria pré-enviar para cada linha de ficheiro e então o ficheiro teria NUMER_DB_ROWS * NUM_COLS linhas