【问题标题】:SQL groupby argmaxSQL groupby argmax
【发布时间】:2021-07-06 18:46:54
【问题描述】:

假设有一个这样的表:

group ID member ID value
0 1 2
0 3 3
0 2 5
1 4 0
1 2 1
2 16 0
2 21 7
2 32 4
2 14 6
3 1 2
... ... ...

该表有三列,一个group ID,唯一标识某个group,一个member ID,唯一标识单个groups内部的members(全局,member ID不是唯一的),和value,这是我们希望在每个组中最大化的东西。

任务是为每个group ID 找到一个member ID,它最大化value。这听起来很简单,对吧?

嗯,显然不是。我正在使用 MariaDB 并尝试了 this page 上的所有内容,例如

select group_id, member_id, value from table x
    join (select max(t.value) as max_v from table t group by group_id) y on y.max_v = x.value;

但是这些方法都没有产生正确的结果。 为了完整起见,上表查询的预期输出将是

group ID member ID value
0 2 5
1 2 1
2 21 7
3 1 2
... ... ...

甚至

group ID member ID
0 2
1 2
2 21
3 1
... ...

如果返回 value 会导致问题。我会感谢任何形式的帮助。

【问题讨论】:

  • 您的子查询还应该返回 group_id,您也应该在 ON 子句中使用它。
  • @forpas 是的,多亏了你和 Rui Costa,我似乎已经找到了解决方案。

标签: mysql sql group-by mariadb argmax


【解决方案1】:

如果 `group_id, member_id, value' 组合是唯一的,这可以工作。

SELECT 
  x.group_id, 
  x.member_id,
  x.value
FROM 
  table x
join 
  (SELECT 
    group_id, 
    max(t.value) as max_v 
   FROM table t 
   GROUP BY group_id
  ) y 
ON y.max_v = x.value 
AND y.group_id = y.group_id

【讨论】:

  • 你是对的,我的错。你能检查更新吗?
  • 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多