SQL groupby argmax
SQL groupby argmax
让table像这样:
组号
会员编号
价值
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
...
...
...
table有三列,一个group ID
,唯一标识某个group
,一个member ID
,唯一标识members
里面的个体groups
(在全球范围内,member ID
不是唯一的),以及 value
,这是我们希望在每个组内最大化的东西。
任务是为每个 group ID
找到最大化 value
的 member ID
。这听起来很简单,对吧?
嗯,显然不是。我正在使用 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;
但是 none 这些方法产生了正确的结果。
为了完整起见,上述 table 查询的预期输出将是
组号
会员编号
价值
0
2
5
1
2
1
2
21
7
3
1
2
...
...
...
甚至
组号
会员编号
0
2
1
2
2
21
3
1
...
...
如果返回 value
会导致问题。我很感激任何形式的帮助。
如果 `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
让table像这样:
组号 | 会员编号 | 价值 |
---|---|---|
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 |
... | ... | ... |
table有三列,一个group ID
,唯一标识某个group
,一个member ID
,唯一标识members
里面的个体groups
(在全球范围内,member ID
不是唯一的),以及 value
,这是我们希望在每个组内最大化的东西。
任务是为每个 group ID
找到最大化 value
的 member ID
。这听起来很简单,对吧?
嗯,显然不是。我正在使用 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;
但是 none 这些方法产生了正确的结果。 为了完整起见,上述 table 查询的预期输出将是
组号 | 会员编号 | 价值 |
---|---|---|
0 | 2 | 5 |
1 | 2 | 1 |
2 | 21 | 7 |
3 | 1 | 2 |
... | ... | ... |
甚至
组号 | 会员编号 |
---|---|
0 | 2 |
1 | 2 |
2 | 21 |
3 | 1 |
... | ... |
如果返回 value
会导致问题。我很感激任何形式的帮助。
如果 `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