如何计算 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。只需分组计数 currencyexchange 并按 currencycount 降序排列。 所以查询将如下所示:

select
distinct on (currency)
currency,
exchange,
count(*)
from table1
group by 1,2
order by 1,3 desc