【问题标题】: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