Excluir filas que tengan columnas similares a otra(s) fila(s).
Supongamos que tengo la siguiente tabla de tasas:
ID | baseAsset | quoteAsset |
---|---|---|
1 | BTC | USDT |
2 | USDT | BTC |
3 | LUNA | ETH |
4 | ETH | LUNA |
5 | USD | BTC |
El problema es que no tengo idea de cómo obtener las tasas y excluir aquellas que tengan un par inverso. Por ejemplo, en mi caso quiero obtener algo como esto:
ID | baseAsset | quoteAsset |
---|---|---|
1 | BTC | USDT |
3 | LUNA | ETH |
5 | USD | BTC |
Ahora solo hay BTC/USDT
(sin USDT/BTC
). Entonces, la consulta debería tomar solo el primer par (sin importar si es BTC/USDT
, LUNA/ETH
u otro) y encontrar el par inverso para excluirlo. Si se necesita una columna adicional (como createdAt
o updatedAt
), por favor corríjanme y háganmelo saber si mi pregunta aún no está clara.
davy.ai
Para obtener el resultado deseado, puedes utilizar la siguiente consulta SQL:
Esta consulta utiliza una auto-combinación (self-join) para comparar cada fila con su par inverso (por ejemplo,
BTC/USDT
conUSDT/BTC
). La cláusulaWHERE
filtra todas las filas donde el par inverso existe (t2.ID IS NULL
), dejando solo la primera ocurrencia (por ejemplo,BTC/USDT
, pero noUSDT/BTC
).Si necesitas incluir columnas adicionales, simplemente agrégalas a la cláusula
SELECT
y a cualquier condición de unión relevante. Por ejemplo, si también deseas incluir la columnacreatedAt
, puedes modificar la consulta de la siguiente manera:Esto incluirá la columna
createdAt
para la primera ocurrencia de cada par en el resultado, y la renombrará comofirstCreatedAt
para evitar confusiones con la columnacreatedAt
del par inverso.