Encuentre qué filas tienen diferentes valores para una columna dada en Teradata SQL
join rows (4)
Estoy tratando de comparar dos direcciones de la misma ID para ver si coinciden. Por ejemplo:
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
Solo estoy tratando de averiguar si la dirección de cada ID coincide. Entonces, en este caso, quiero devolver solo el ID 3 que tiene una dirección diferente para los códigos de dirección 1 y 2.
Únete a la tabla consigo misma y dale dos alias diferentes ( A
y B
en el siguiente ejemplo). Esto permite comparar diferentes filas de la misma tabla.
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
La comparación "menor que" <
garantiza que obtengas 2 direcciones diferentes y que no obtengas los mismos 2 códigos de dirección dos veces. Usando "no igual" <>
cambio, produciría los códigos como (1, 2) y (2, 1); cada uno de ellos para el alias A
y el alias B
a su vez.
La cláusula de unión es responsable del emparejamiento de las filas donde, al igual que la cláusula where, prueba condiciones adicionales.
La consulta anterior funciona con cualquier código de dirección. Si desea comparar direcciones con códigos de dirección específicos, puede cambiar la consulta a
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 esto podría ser útil para encontrar clientes que tengan una dirección de facturación (Código de dirección = 1 como ejemplo) que difiera de la dirección de entrega (Código de dirección = 2).
Esto funciona para PL / SQL:
select count(*), id,address from table group by id,address having count(*)<2
Personalmente, los imprimiría en un archivo usando Perl o Python en el formato
<COL_NAME>: <COL_VAL>
para cada fila de modo que el archivo tenga tantas líneas como columnas. Luego haría una diff
entre los dos archivos, asumiendo que está en Unix o comparándolos usando alguna utilidad equivalente en otro sistema operativo. Si tiene varios conjuntos de registros (es decir, más de una fila), añadiría ante cada fila de archivo y luego el archivo tendría NUM_DB_ROWS * NUM_COLS líneas
Puedes hacerlo usando un grupo por:
select id, addressCode
from t
group by id, addressCode
having min(address) <> max(address)
Otra forma de escribir esto puede parecer más clara, pero no funciona tan bien:
select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1