【问题标题】:how to group by and add min field in the result如何在结果中分组并添加最小字段
【发布时间】:2015-01-29 22:26:06
【问题描述】:

我有这种桌子

currency| platform | rank
---------------------------
EUR/USD | UBS      | 1
EUR/USD | DB       | 2
USD/JPY | JP       | 1
USD/JPY | MS       | 2

我要查询并得到流动的结果

currency| platform | rank
---------------------------
EUR/USD | UBS      | 1
USD/JPY | JP       | 1

所以我的查询看起来像这样

select currency,min(rank)
from xxx
group by currency

如何在我的结果中也获得匹配的平台?

【问题讨论】:

    标签: mysql sql group-by google-bigquery


    【解决方案1】:

    我认为解决此问题的最简单方法是使用group_concat()/substring_index() 技巧:

    select currency,
           substring_index(group_concat(platform order by rank), ',', 1) as platform,
           min(rank)
    from xxx
    group by currency;
    

    这应该适用于合理的数据。如果您有大量数据,则必须注意指定group_concat() 结果的最大长度的参数。

    【讨论】:

      【解决方案2】:

      这是 BigQuery 的解决方案 - 它具有用于创建 REPEATED(又名 ARRAY)的 NEST 聚合函数,这使其比 GROUP_CONCAT 更具“关系性”:

      select currency, first(platform) within record, rank from (
      select currency, nest(platform) as platform, min(rank) rank from
      (select 'EUR/USD' currency, 'UBS' platform, 1 rank),
      (select 'EUR/USD' currency, 'DB' platform, 2 rank),
      (select 'USD/JPY' currency, 'JP' platform, 1 rank),
      (select 'USD/JPY' currency, 'MS' platform, 1 rank)
      group by 1)
      

      【讨论】:

        【解决方案3】:

        另一方面,我认为 group_concat 函数对关系数据库的想法很反感!无论如何,您已经很接近了...只需将您的子查询加入表中...

        SELECT a.* 
          FROM xxx a
          JOIN 
             ( select currency,min(rank) min_rank
                 from xxx
                group 
                   by currency
             ) b
            ON b.currency = a.currency
           AND b.min_rank = a.rank
        

        【讨论】:

          猜你喜欢
          • 2015-01-08
          • 1970-01-01
          • 2013-07-01
          • 1970-01-01
          • 2019-03-05
          • 2017-11-15
          • 2021-03-14
          • 2017-06-24
          • 1970-01-01
          相关资源
          最近更新 更多