查找记录的属性是 GROUP BY 语句中某物的 MAX?

Posted

技术标签:

【中文标题】查找记录的属性是 GROUP BY 语句中某物的 MAX?【英文标题】:Finding attribute of record being the MAX of something in GROUP BY statement? 【发布时间】:2011-08-24 20:20:26 【问题描述】:

这是一个有点难以表述的问题(任何编辑都值得赞赏),但在这里。假设您有两个表:FRUITBASKET。水果(代表实际物品,而不是水果种类)按篮子分组。这是FRUIT 的一个例子:

FRUIT_ID  WEIGHT_IN_GRAMS  BASKET_ID FRUIT_TYPE
--------  ---------------  --------- ----------
1         100              1         Apple     
2         200              1         Orange    
3         150              1         Lemon     
4         100              2         Apple
5         300              2         Plum

我想要的是FRUIT_ID每个篮子里最重的水果。换句话说:

FRUIT_ID  BASKET_ID  FRUIT_TYPE
--------  ---------  ----------
2         1          Orange
5         2          Plum

这是我找到这个的 SQL:

select fruit_id, basket_id, fruit_type
  from fruit f
  join (select basket_id, max(weight_in_grams) max_weight
          from fruit
         group by basket_id) t on f.basket_id = t.basket_id
                              and f.weight_in_grams = t.max_weight;

除了 WEIGHT_IN_GRAMS 不保证是唯一的之外,这可以工作。在有重复的情况下,我想要按字母顺序排在最后的那个。

有接受者吗?

PS:我知道我可以将上面的查询包装在另一个查询中,但这感觉相当混乱,所以我正在寻找的是尽可能优化它。

【问题讨论】:

我真的不明白你的 BASKET 表是如何适应这一切的。您似乎正在将 FRUIT 加入 FRUIT。你能发布每个表的确切定义吗? BASKET 表实际上只是水果的任意分组。这是我遇到的实际问题的类比,其中的细节会使这个问题更加难以理解。 【参考方案1】:

您可以使用 dense_rank 为每一行分配数字。 partition by 创建具有自己序列的组(在本例中为每个篮子)。 order by 指定排序,因此首先按重量排序(降序),然后按名称排序。

每个篮子的第一行获得数字 1。然后,包装查询以仅选择获得数字 1 的行。您需要在子查询中执行此操作,因为分析函数不能用于我相信 where 子句,而不是 having 子句。

select
    fruit_id, basket_id, fruit_type, weight_in_grams
from
    (select
      fruit_id, basket_id, fruit_type, weight_in_grams,
      dense_rank() over (partition by basket_id order by weight_in_grams desc, fruit_type desc) as rank
    from
      fruit f)
where
    rank = 1

【讨论】:

您不想在 OVER 子句中对fruit_type DESC 进行排序,以便在重量上按字母顺序排列的情况下得到最后一个,OS OP 希望吗? @DCookie。谢谢。我一定忽略了问题中的“最后一个”。 :) 修复它。 Oracle 从未停止以其专有的魔力令人惊叹。谢谢!

以上是关于查找记录的属性是 GROUP BY 语句中某物的 MAX?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的select语句where条件group by ,having , order by,limit的顺序及用法

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法

mysql中“group by、having、order by、limit”的顺序及用法是啥?

mysql中“group by、having、order by、limit”的顺序及用法是啥?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?