如何计算 SQL 中出现频率最高的值
How to calculate top frequent value in SQL
我有一个 table,它包含三列:货币、交易该货币的交易所、日期
Currency Exchange Date
USD NewYork 01/12/20
USD NewYork 01/11/20
USD NewYork 01/10/20
USD Montreal 01/10/20
CAD Montreal 01/07/20
CAD Montreal 01/06/20
CAD Beijing 01/06/20
我需要回答哪个交易所是该特定货币的领导者的问题。
这意味着对于给定的货币,计算兑换多少条记录
并且 return 只有最大值
换句话说,查询的结果应该是这样的
Currency Exchange Frequency
USD NewYork 3
CAD Montreal 2
如果你想要聚合查询中最常见的行,那么使用window函数:
select ce.*
from (select currency, exchange, count(*) as cnt,
rank() over (partition by currency order by count(*) desc) as seqnum
from t
group by currency, exchange
) ce
where seqnum = 1;
注意:如果出现平局,这 return 都是最大值。如果你只想要一个,那么使用 row_number()
而不是 rank()
.
编辑:
在Postgres中(我回答后添加的),你可以使用distinct on
:
select distinct on (currency) exchange, count(*) as cnt
from t
group by currency, exchange
order by currency, count(*) desc;
请注意,如果有联系,这不会 return 重复。
您可以使用 window 函数:
select *
from (
select currency, exchange, count(*) frequency,
rank() over(partition by currency order by count(*) desc) rn
from mytable
group by currency, exchange
) t
where rn = 1
使用 first_value()
和 max()
window 函数:
select distinct currency,
first_value(exchange) over (partition by currency order by count(*) desc) exchange,
max(count(*)) over (partition by currency) frequency
from tablename
group by currency, exchange
参见demo。
结果:
> currency | exchange | frequency
> :------- | :---------- | --------:
> CAD | Montreal | 2
> USD | NewYork | 3
场景中可以使用distinct on
。只需分组计数
currency
和 exchange
并按 currency
和 count
降序排列。
所以查询将如下所示:
select
distinct on (currency)
currency,
exchange,
count(*)
from table1
group by 1,2
order by 1,3 desc
我有一个 table,它包含三列:货币、交易该货币的交易所、日期
Currency Exchange Date
USD NewYork 01/12/20
USD NewYork 01/11/20
USD NewYork 01/10/20
USD Montreal 01/10/20
CAD Montreal 01/07/20
CAD Montreal 01/06/20
CAD Beijing 01/06/20
我需要回答哪个交易所是该特定货币的领导者的问题。
这意味着对于给定的货币,计算兑换多少条记录 并且 return 只有最大值 换句话说,查询的结果应该是这样的
Currency Exchange Frequency
USD NewYork 3
CAD Montreal 2
如果你想要聚合查询中最常见的行,那么使用window函数:
select ce.*
from (select currency, exchange, count(*) as cnt,
rank() over (partition by currency order by count(*) desc) as seqnum
from t
group by currency, exchange
) ce
where seqnum = 1;
注意:如果出现平局,这 return 都是最大值。如果你只想要一个,那么使用 row_number()
而不是 rank()
.
编辑:
在Postgres中(我回答后添加的),你可以使用distinct on
:
select distinct on (currency) exchange, count(*) as cnt
from t
group by currency, exchange
order by currency, count(*) desc;
请注意,如果有联系,这不会 return 重复。
您可以使用 window 函数:
select *
from (
select currency, exchange, count(*) frequency,
rank() over(partition by currency order by count(*) desc) rn
from mytable
group by currency, exchange
) t
where rn = 1
使用 first_value()
和 max()
window 函数:
select distinct currency,
first_value(exchange) over (partition by currency order by count(*) desc) exchange,
max(count(*)) over (partition by currency) frequency
from tablename
group by currency, exchange
参见demo。
结果:
> currency | exchange | frequency
> :------- | :---------- | --------:
> CAD | Montreal | 2
> USD | NewYork | 3
场景中可以使用distinct on
。只需分组计数
currency
和 exchange
并按 currency
和 count
降序排列。
所以查询将如下所示:
select
distinct on (currency)
currency,
exchange,
count(*)
from table1
group by 1,2
order by 1,3 desc