es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar la siguiente consulta SQL:

    SELECT t1.*
    FROM rates t1
    LEFT JOIN rates t2 ON t1.baseAsset = t2.quoteAsset AND t2.baseAsset = t1.quoteAsset AND t1.ID > t2.ID
    WHERE t2.ID IS NULL
    

    Esta consulta utiliza una auto-combinación (self-join) para comparar cada fila con su par inverso (por ejemplo, BTC/USDT con USDT/BTC). La cláusula WHERE filtra todas las filas donde el par inverso existe (t2.ID IS NULL), dejando solo la primera ocurrencia (por ejemplo, BTC/USDT, pero no USDT/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 columna createdAt, puedes modificar la consulta de la siguiente manera:

    SELECT t1.*, t1.createdAt AS firstCreatedAt
    FROM rates t1
    LEFT JOIN rates t2 ON t1.baseAsset = t2.quoteAsset AND t2.baseAsset = t1.quoteAsset AND t1.ID > t2.ID
    WHERE t2.ID IS NULL
    

    Esto incluirá la columna createdAt para la primera ocurrencia de cada par en el resultado, y la renombrará como firstCreatedAt para evitar confusiones con la columna createdAt del par inverso.

Comments are closed.