我有这样的桌子,
| id | name | subtask | maintask |
|----|------|---------|----------|
| 1 | t1 | 11 | 20 |
| 1 | t1 | 12 | 20 |
| 1 | t1 | 1 | 30 |
| 2 | t1 | 2 | 20 |
| 2 | t1 | 2 | 20 |
我想准备这样的结果
| id | name | sum_of_subtask | sum_of_maintask | diff |
|----|------|----------------|-----------------|------|
| 2 | t1 | 4 | 40 | 36 |
需要选择最大ID,然后对子任务和主任务进行求和,然后最后一列是sum(子任务)与sum(主任务)的差
我在下面的查询中尝试了此方法,但是它计算所有列的总和。
select max(id), name, sum(subtask),sum(maintask),sum(subtask-maintask) from tbl
group by name
您只想要一行吗?如果是这样,请使用order by
和limit
:
select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
from tbl
group by id, name
order by id desc
limit 1;
如果数据很大,则过滤[[之前聚合可能会更有效:
select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
from tbl
where id = (select max(id) from tbl)
group by id, name;
如果要每个id
的最大name
,则过滤逻辑为:
select id, name, sum(subtask), sum(maintask), sum(subtask-maintask) from tbl t where t.id = (select max(t2.id) from tbl t2 where t2.name = t.name) group by id, name;
select id, name, sum(subtask), sum (maintask), sum(subtask)-sum (maintask)
where id in
(select max(id) from table)
group by id, name;
select id, name, sum(subtask), sum(maintask), sum(subtask-maintask)
from tbl
where id = (select max(id) from tbl)
group by id, name