在不同条件下执行两次求和

Perform two sums with different conditions

我需要在不同的条件下执行两个求和:

ID Value Date1 Date2
01 01 2022-02-15 2022-02-15
01 01 2022-02-15 2022-02-19
01 03 2022-02-15 2022-02-17
01 02 2022-02-16 2022-02-20
01 01 2022-02-16 2022-02-22
01 04 2022-02-16 2022-02-28

预期结果:

ID Date1 SUM1 SUM2
01 2022-02-15 05 04
01 2022-02-16 07 05

关于如何得到这个结果有什么建议吗?

您可以尝试在子查询中使用 LEAD window 函数,它将获得每个 Date1 的下一个值(这将忽略每个 Date1 的最小值)。

然后在 value 列和 LEAD window 函数列上执行 sum

SELECT ID,
       Date1,
       SUM(Value) SUM1,
       SUM(n_val) SUM2
FROM (
    SELECT *,
           LEAD(Value) OVER(PARTITION BY ID,Date1 ORDER BY Date2) n_val
    FROM table_views 
) t1
GROUP BY ID,Date1;

sqlfiddle

由于partition bygroup by的配合并不总是很好,您可以使用CTE来实现结果:

with tmp as (
    select tv.*, first_value(value) over (partition by id, date1 order by date2) date2_value
    from table_views tv
)
select id, date1, sum(value) 
from tmp
group by id, date1
union all
select id, date1, sum(value) - min(date2_value)
from tmp
group by id, date1;

Here 是 db_fiddle.

我在这里使用了 min,但这是任意的,任何其他的都可以:maxavg