MySQL MAX Value 使用 GROUP BY 跳过条目

标签 mysql sql greatest-n-per-group

我在一个名为 entries 的 sql 表中有一些数据

username    location    species date    length  weight  timestamp   id
    BooF    Black Lake  Smallmouth Bass 2014-08-12  12  1   2014-08-04 12:58:00 1
    BooF    Black Lake  Largemouth Bass 2014-08-13  15  2   2014-08-04 12:58:00 2
    BooF    Black Lake  Largemouth Bass 2014-08-19  20  5   2014-08-04 12:58:00 3
    BooF    Lake Bonaparte  Smallmouth Bass 2014-08-13  13  1   2014-08-04 12:58:00 4
    BooF    Lake Bonaparte  Largemouth Bass 2014-08-28  14  2   2014-08-04 12:58:00 5
    BooF    Black Lake  Largemouth Bass 2014-08-27  18  3   2014-08-04 13:22:03 6
    BooF    Lake Bonaparte  Smallmouth Bass 2014-08-19  14.3    3.4 2014-08-05 16:58:47 8
    BooF    Cranberry Lake  Walleye 2014-08-05  10  1   2014-08-18 17:14:00 10
    BooF    Cranberry Lake  Walleye 2014-08-05  10  1   2014-08-18 17:16:28 11
            Indian Lake Walleye 2014-08-05  10  1   2014-08-18 17:30:14 13
    BooF    Indian Lake Walleye 2014-08-05  10  1   2014-08-18 17:34:38 14
    BooF    Crystal Lake    Walleye 2014-08-06  10  4   2014-08-18 17:35:29 15
    BooF    Hudson River    Walleye 2014-08-11  10  2   2014-08-19 15:29:19 16
    BooF    Indian River    Northern Pike   2014-08-05  20  2   2014-08-26 09:46:03 17
            Hudson River    Smallmouth Bass 2014-08-05  12  1   2014-08-26 09:47:14 18
    BooF    Hyde Lake   Pickerel    2014-08-06  20  2   2014-08-26 09:48:24 20
--> BooF    Lake Ozonia Walleye 2014-08-14  20  3   2014-08-26 10:10:59 23
--> BooF    Mud Lake    Walleye 2014-08-14  21  2   2014-08-26 10:10:59 24
    Daswabbage  Lake Ontario    White Crappie   2014-08-12  15  20  2014-08-26 12:25:00 26
    Daswabbage  Lake Ontario    White Crappie   2014-08-06  16  21  2014-08-26 12:25:49 27
    Daswabbage  Butterfield Lake    Black Crappie   2014-08-13  5   2   2014-08-26 12:27:00 28
    Daswabbage  Black River Smallmouth Bass 2014-08-12  12  2   2014-08-26 12:28:09 29
    Daswabbage  Cranberry Lake  Smallmouth Bass 2014-08-20  5   5   2014-08-26 12:34:10 30
    Daswabbage  Clear Lake  Smallmouth Bass 2014-08-05  3   6   2014-08-26 12:41:52 31
    Daswabbage  Clear Lake  Smallmouth Bass 2014-08-06  10  7   2014-08-26 13:00:48 32
    BooF    Cranberry Lake  Pickerel    2014-08-07  15  5   2014-08-26 15:13:45 34
    BooF    Cranberry Lake  Pickerel    2014-08-02  13  6   2014-08-26 15:15:08 35
    BooF    Butterfield Lake    White Crappie   2014-08-18  10  26  2014-08-26 15:15:42 36
--> BooF    Lake Ozonia Walleye 2014-08-31  9   5   2014-08-26 15:17:18 37
--> BooF    Grass Lake  White Crappie   2014-08-11  15  30  2014-08-26 15:18:52 38
--> BooF    Grass Lake  White Crappie   2014-08-20  15  30  2014-08-26 16:06:44 39
--> BooF    Crystal Lake    White Crappie   2014-08-20  6   10  2014-08-26 16:59:32 43

我正在尝试为特定用户收集每个物种的最大长度。我试过了

"SELECT length.* FROM entries length 
    INNER JOIN (SELECT species, MAX(length) AS  MaxLength 
    FROM entries WHERE username = 'BooF' GROUP BY species) 
    groupedlength ON   
    length.species = groupedlength.species AND length.length = groupedlength.MaxLength 
    ORDER BY species"

我也试过

SELECT * FROM (SELECT * FROM entries ORDER BY length DESC) tmp 
    WHERE username='BooF' GROUP BY species

这两种方式似乎产生相同的结果

username    location    species date    length  weight  timestamp   id
    BooF    Black Lake  Largemouth Bass 2014-08-19  20  5   2014-08-04 12:58:00 3
    BooF    Indian River    Northern Pike   2014-08-05  20  2   2014-08-26 09:46:03 17
    BooF    Hyde Lake   Pickerel    2014-08-06  20  2   2014-08-26 09:48:24 20
    BooF    Lake Bonaparte  Smallmouth Bass 2014-08-19  14.3    3.4 2014-08-05 16:58:47 8
    BooF    Lake Ozonia Walleye 2014-08-31  9   5   2014-08-26 15:17:18 37
    BooF    Crystal Lake    White Crappie   2014-08-20  6   10  2014-08-26 16:59:32 43

如果你能读懂我乱七八糟的乱七八糟的东西,那就是角膜白斑鱼和白鲈鱼是错误的。长度 9 和长度 6 显然不是我原始数据中那些鱼的最大长度。我相信我正在正确执行我的功能,但不清楚为什么它们会跳过高于输出数据的数字。提前致谢。

最佳答案

如果您只需要 Max length这是一个简单的聚合:

SELECT MAX(length), species FROM entries WHERE username = 'BooF' group by species

如果您还需要与最大记录相关的表的其他列,它会变得更加棘手。 请注意,简单地添加所需的列(或选择 * 而没有聚合)不会给出正确的结果,因为您缺少这些列的聚合。 (MsSQL 显然会抛出错误,mysql 会为您未应用聚合的列返回未定义的内容)

假设您还想让其他列与相关记录相关联,您可以执行以下操作:

  • 自己加入表格
  • 添加比较 <连接条件以确保您获得每个表的最大条目。
  • 然后选择正确结果集 isnull 所在的每个结果- 因为没有更大的匹配项 -> 这是最大的结果行。

喜欢:

SELECT
  `left`.*
FROM
  entries `left`
LEFT JOIN
  entries `right`
ON
  `left`.species = `right`.species -- only compare the same species
  AND `left`.username = `right`.username -- only compare  for the same user
  AND `left`.length < `right`.length -- smaller result on the left side.
WHERE
  ISNULL(`right`.id); -- choose the one that has no larger match.
  AND `left`.username = 'BooF' -- just for BooF.

附:leftright是哑表别名,因为它们是保留关键字:)

关于MySQL MAX Value 使用 GROUP BY 跳过条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25530292/

相关文章:

mysql - 仅选择最新的分组条目

mysql - 最佳数据库模式结构

mysql - 获取mysql中某个值出现的百分比

php - 使用 PHP exec 调用 MySQL exe 不起作用

php - 如何使用 PHP 创建自定义 CSV 文件?

c# - 如何从 MySql 工作台获取 MySql DB 连接信息?

mysql - 排除相似行的 SQL 计数

php - MySQL 查询优化 - 分组值

sql - 如何找到分组的 SQL 中位数

SQL选择子组的最早日期