MySQL里的选出分组极值行

应用需要从大表中选出每个分组中含有某列最大值的那行,很自然写出如下查询:

SELECT  g1,  f1, max(f2)  FROM t1 GROUP BY g1;

后来经网络上一查,确实另外也有人也这么问这么答了,心中窃道“英雄所见”。


后来由于MySQL的一个bug,改用SQL Server测试,才发现这么好用的一条语句竟然不被允许!

心中纳闷,一查才知道,好像说这也算是MySQL的一点宽容扩展,SQL标准是不赞同这么干的——只有分组字段才适合同聚集函数一起被SELECT出来。


后来越想越觉得对结果不放心——到底是不是真能选出最大的那行?

于是自己做个小测试验证一下:


CREATE TABLE t(id int, f1 int, a1 int);

INSERT INTO t VALUES (1, 1, 1), (1, 2, 2), (1, 3, 3), (2, 3, 3), (2, 4, 4), (2, 2, 2);

SELECT * FROM t;

SELECT id, f1, max(a1) FROM t GROUP BY id;


猜猜结果是什么?



才知道自己错得有多离谱!!!


===========================================

A very smart solution suggested by Bill Karwin:


SELECT t1.*
FROM t AS t1
LEFT OUTER JOIN t AS t2
ON (t1.id = t2.id AND t1.a1 < t2.a1)
WHERE t2.id IS NULL;

In other words: fetch the row from t1 where no other row exists with the same "id" and a greater "a1"


(From: http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值