排除与另一行具有相似列的行

Exclude rows having similar columns with another row(s)

假设我有以下 table 比率:

  ID   |   baseAsset  |    quoteAsset  
-------+--------------+-----------------
   1   |     BTC      |      USDT         
   2   |     USDT     |      BTC         
   3   |     LUNA     |      ETH          
   4   |     ETH      |      LUNA         
   5   |     USD      |      BTC          

问题是我不知道如何获取汇率并排除那些具有反向对的汇率。例如。就我而言,我想得到这样的东西:

  ID   |   baseAsset  |    quoteAsset  
-------+--------------+-----------------
   1   |     BTC      |      USDT        
   3   |     LUNA     |      ETH          
   5   |     USD      |      BTC          

现在只有BTC/USDT(没有USDT/BTC)。因此,查询应仅采用第一对(无论 BTC/USDTLUNA/ETH 或另一对)并找到要排除的反向对。如果应该有额外的专栏(如 createdAtupdatedAt)——请纠正我,如果我的问题仍然不清楚,请告诉我。

在 SQL 中,您将为此使用 LEASTGREATEST,前提是您的 DBMS 支持这些功能:

select
  min(id),
  least(baseAsset, quoteAsset) as asset1,
  greatest(baseAsset, quoteAsset) as asset2,
from mytable
group by least(baseAsset, quoteAsset), greatest(baseAsset, quoteAsset)
order by min(id);

在标准 SQL 中,您可以将上面的 LEAST 替换为

CASE WHEN baseAsset < quoteAsset THEN baseAsset ELSE quoteAsset END

及以上 GREATEST

CASE WHEN baseAsset > quoteAsset THEN baseAsset ELSE quoteAsset END

另一种简单的方法是使用 NOT EXISTS:

select *
from mytable
where not exists
(
  select null
  from mytable reverse
  where reverse.baseAsset = mytable.quoteAsset
  and reverse.quoteAsset = mytable.baseAsset
  and reverse.id < mytable.id
);