SQL - SUM 但过滤 2 个最大列
SQL - SUM but filter the 2 max column
我有一个 table 如下所示。
qid segment task before after diff
------------------------------------------
1 0 aaa 5 5 0
1 0 aaa 5 5 0
1 1 aaa 15 15 0
1 1 aaa 10 5 10
1 0 aaa 10 5 5
3 0 bbb 10 4 6
对于每个任务,我需要对之前、之后和差异进行求和 values.But 我只想在高 qid 和段上执行此操作。
例如:对于任务 A,
- 高 qid = 1
- 高段=1
这是我要为任务 A 选择的行。
对于任务 B,
- 高 qid = 3
- 高分段=0
最后一行是我要计算的。
预期输出:
task before after diff
-----------------------------
aaa 25 20 10
bbb 10 4 6
试试 dense_rank
。这是 demo.
with cte as
(
select
*,
dense_rank() over (partition by task order by qid desc, segment desc) as rnk
from myTable
)
select
task,
sum(before) as before,
sum(after) as after,
sum(diff) as diff
from cte
where rnk = 1
group by
task
输出:
| task | before | after | diff |
| ---- | ------ | ----- | ---- |
| aaa | 25 | 20 | 10 |
| bbb | 10 | 4 | 6 |
您可以使用聚合和 distinct on
:
select distinct on (task)
qid,
segment,
task,
sum(before) before,
sum(after) after,
sum(diff) diff
from mytable t
group by task, qid, segment
order by task, qid desc, segment desc
我有一个 table 如下所示。
qid segment task before after diff
------------------------------------------
1 0 aaa 5 5 0
1 0 aaa 5 5 0
1 1 aaa 15 15 0
1 1 aaa 10 5 10
1 0 aaa 10 5 5
3 0 bbb 10 4 6
对于每个任务,我需要对之前、之后和差异进行求和 values.But 我只想在高 qid 和段上执行此操作。
例如:对于任务 A,
- 高 qid = 1
- 高段=1
这是我要为任务 A 选择的行。
对于任务 B,
- 高 qid = 3
- 高分段=0
最后一行是我要计算的。
预期输出:
task before after diff
-----------------------------
aaa 25 20 10
bbb 10 4 6
试试 dense_rank
。这是 demo.
with cte as
(
select
*,
dense_rank() over (partition by task order by qid desc, segment desc) as rnk
from myTable
)
select
task,
sum(before) as before,
sum(after) as after,
sum(diff) as diff
from cte
where rnk = 1
group by
task
输出:
| task | before | after | diff |
| ---- | ------ | ----- | ---- |
| aaa | 25 | 20 | 10 |
| bbb | 10 | 4 | 6 |
您可以使用聚合和 distinct on
:
select distinct on (task)
qid,
segment,
task,
sum(before) before,
sum(after) after,
sum(diff) diff
from mytable t
group by task, qid, segment
order by task, qid desc, segment desc