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,

这是我要为任务 A 选择的行。

对于任务 B,

最后一行是我要计算的。

预期输出:

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