【问题标题】:How to calculate top frequent value in SQL如何计算 SQL 中的最高频率值
【发布时间】:2021-01-30 22:21:29
【问题描述】:

我有一个包含三列的表格:货币、交易该货币的交易所、日期

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

我需要回答哪个交易所是这种特定货币的领导者的问题。

这意味着对于给定的货币,计算要兑换的记录数 并且只返回最大值 换句话说,查询的结果应该是这样的

Currency Exchange Frequency 
USD      NewYork  3
CAD      Montreal 2 

【问题讨论】:

  • 那么37 是从哪里来的?
  • Gordon Linoff 他们来自于他们在表格中出现的次数
  • @OlliePugh 。 . .它们与您的示例数据不匹配。
  • 请用您正在运行的数据库标记您的问题:mysql、oracle、postgresql...?
  • @GordonLinoff 这不是我的示例数据,哈哈

标签: sql postgresql count aggregate-functions greatest-n-per-group


【解决方案1】:

如果您想要聚合查询中最常见的行,请使用窗口函数:

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;

注意:如果出现平局,则返回所有最大值。如果您只想要一个,请使用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;

请注意,如果有平局,这不会返回重复项。

【讨论】:

    【解决方案2】:

    你可以使用窗口函数:

    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
    

    【讨论】:

      【解决方案3】:

      使用first_value()max() 窗口函数:

      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
      

      【讨论】:

        【解决方案4】:

        您可以在场景中使用distinct on。只需通过分组计数 currencyexchange 并按 currencycount 降序排列。 所以查询将如下所示:

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

        【讨论】:

          猜你喜欢
          • 2020-05-19
          • 2020-05-09
          • 2020-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多