排除与另一行具有相似列的行
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/USDT
、LUNA/ETH
或另一对)并找到要排除的反向对。如果应该有额外的专栏(如 createdAt
或 updatedAt
)——请纠正我,如果我的问题仍然不清楚,请告诉我。
在 SQL 中,您将为此使用 LEAST
和 GREATEST
,前提是您的 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
);
假设我有以下 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/USDT
、LUNA/ETH
或另一对)并找到要排除的反向对。如果应该有额外的专栏(如 createdAt
或 updatedAt
)——请纠正我,如果我的问题仍然不清楚,请告诉我。
在 SQL 中,您将为此使用 LEAST
和 GREATEST
,前提是您的 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
);