查找记录的属性是 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 【问题描述】:这是一个有点难以表述的问题(任何编辑都值得赞赏),但在这里。假设您有两个表:FRUIT
和 BASKET
。水果(代表实际物品,而不是水果种类)按篮子分组。这是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”的顺序及用法是啥?