在不同条件下执行两次求和
Perform two sums with different conditions
我需要在不同的条件下执行两个求和:
- 第一个总和:必须 return 每个 date1 和 id 的值的总和(按 date1 和 id 分组)。
- 第二个和:必须return每个date1和id的值之和(按date1和id分组),没有对应最小date2的值。
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
sum2中,对于data1=2022-02-15,去掉了data2=2022-02-15对应的值,因为它是分组中data2的最小值
sum2中,对于data1 = 2022-02-16,data2=2022-02-20对应的值被去掉,因为它是分组中data2的最小值。
关于如何得到这个结果有什么建议吗?
您可以尝试在子查询中使用 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;
由于partition by
与group 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
,但这是任意的,任何其他的都可以:max
、avg
等
我需要在不同的条件下执行两个求和:
- 第一个总和:必须 return 每个 date1 和 id 的值的总和(按 date1 和 id 分组)。
- 第二个和:必须return每个date1和id的值之和(按date1和id分组),没有对应最小date2的值。
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 |
sum2中,对于data1=2022-02-15,去掉了data2=2022-02-15对应的值,因为它是分组中data2的最小值
sum2中,对于data1 = 2022-02-16,data2=2022-02-20对应的值被去掉,因为它是分组中data2的最小值。
关于如何得到这个结果有什么建议吗?
您可以尝试在子查询中使用 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;
由于partition by
与group 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
,但这是任意的,任何其他的都可以:max
、avg
等