为了账号安全,请及时绑定邮箱和手机立即绑定

选择每个GROUP BY组中的第一行?

选择每个GROUP BY组中的第一行?

临摹微笑 2019-05-21 15:16:27
正如标题所示,我想选择用a组成的每组行的第一行GROUP BY。具体来说,如果我有一个purchases看起来像这样的表:SELECT * FROM purchases;我的输出:id | 客户| 总--- + ---------- + ------ 1 | 乔| 五 2 | 莎莉| 3 3 | 乔| 2 4 | 莎莉| 1我想查询每个产品id的最大购买量(total)customer。像这样的东西:SELECT FIRST(id), customer, FIRST(total)FROM  purchasesGROUP BY customerORDER BY total DESC;预期产出:FIRST(id)| 客户| FIRST(总)---------- + ---------- + -------------        1 | 乔| 五        2 | 莎莉| 3
查看完整描述

5 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

这是常见的最大n组问题,已经有经过充分测试和高度优化的解决方案。我个人更喜欢Bill Karwin左连接解决方案原始帖子中有很多其他解决方案)。

请注意,对于这个常见问题的一堆解决方案可以在大多数官方来源,MySQL手册中找到!请参阅常见查询示例::保持某个列的分组最大值的行


查看完整回答
反对 回复 2019-05-21
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

在Postgres中你可以array_agg像这样使用:

SELECT  customer,
        (array_agg(id ORDER BY total DESC))[1],
        max(total)FROM purchasesGROUP BY customer

这将为您id提供每个客户最大的购买。

有些事情需要注意:

  • array_agg是一个聚合函数,所以它适用GROUP BY

  • array_agg允许您指定作用于自身的排序,因此它不会约束整个查询的结构。如果您需要执行与默认值不同的操作,还有关于如何对NULL进行排序的语法。

  • 构建数组后,我们采用第一个元素。(Postgres数组是1索引的,不是0索引的)。

  • 您可以array_agg以类似的方式使用第三个输出列,但max(total)更简单。

  • 不同的是DISTINCT ON,使用array_agg让你保留你的GROUP BY,以防你出于其他原因。


查看完整回答
反对 回复 2019-05-21
  • 5 回答
  • 0 关注
  • 1411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信