mysql:group by column(显示值较大的列)

dojqjjoe  于 2022-12-03  发布在  Mysql
关注(0)|答案(2)|浏览(158)

我在“MENU”表中有一些行

id, shop, size
1,  1   , 3
2,  1   , 8
3,  2   , 5

我需要为每个商店显示1行,因此如果商店ID相同,则显示列大小上具有高值的行,结果应如下所示

id, shop, size
2,  1   , 8
3,  2   , 5

此外,如果两行的size都为0,则只显示1行
我需要这样的东西

SELECT * FROM menu GROUP by shop

但要显示具有高值的行
我已经尝试过这个方法,但是如果行在列大小上有0,那么它会同时显示这两个值

SELECT a.* FROM menu a                   
LEFT JOIN menu b            
ON a.shop=b.shop AND a.size< b.size
WHERE b.size NULL
kcrjzv8t

kcrjzv8t1#

如果您使用的是支持 * 窗口函数 * 的最新版本的MySql,则通常使用 row_number 解决此问题:

with t as (
  Select *, row_number() over(partition by Shop order by Size desc) rn
  from Menu
)
select Id, Shop, size
from t
where rn = 1;
h7appiyu

h7appiyu2#

解决此类问题最典型的方法是使用ROW_NUMBERRANKDENSE_RANK,如Stu的答案所示。
另一个选项:获取每个商店的最大大小,然后使用此结果检索行:

SELECT * 
FROM menu
WHERE (shop, size) IN
(
  SELECT shop, MAX(size)
  FROM menu
  GROUP by shop
);

另一个选项:选择不存在具有相同商店但尺寸更大的行的行:

SELECT * 
FROM menu
WHERE NOT EXISTS
(
  SELECT null
  FROM menu better
  WHERE better.shop = menu.shop
  AND better.size > menu.size
);

相关问题