RBK*_*RBK 5 sql postgresql aggregate-functions
我有一个数据集:
Code | Value0 | Value1 | Value2 |
------------| --------|----------- | -----------|
CAR | 44000 | 5.0 | 2 |
CBB | 1000 | 0.89 | 9 |
CC | 1450 | 1.56 | 5 |
CIVG | 21000 | 0.786 | 19 |
CIVR | 7000 | 134.6 | 15 |
CBB | 21000 | 440 | 39 |
CC | 14000 | 16.78 | 35 |
CIVG | 100 | 98.56 | 9 |
CIVR | 45000 | 15 | 54 |
Run Code Online (Sandbox Code Playgroud)
我想根据列进行聚合code,使用过滤器 Only those rows should be summed which have value0 greater than 10000。但是,此异常或过滤器应仅适用于代码CIVG and CIVR。此过滤器不适用于其他代码。
我已经能够弄清楚的查询:
select code ,
count(1) filter (where value0 > 10000 ) as funt,
count(1) ount,
sum(value2) filter (where value0 > 10000 ) "farc" ,
sum(value2) "oarc"
from table
group by code
order by code;
Run Code Online (Sandbox Code Playgroud)
使用它,我得到以下结果:
Code | funt | ount | farc | oarc |
------------| -----|---------| ------------|----------|
CAR | 1 | 1 | 2 | 2 |
CBB | 1 | 2 | 39 | 48 |
CC | 1 | 2 | 35 | 40 |
CIVG | 1 | 2 | 19 | 28 |
CIVR | 1 | 2 | 54 | 69 |
Run Code Online (Sandbox Code Playgroud)
我想要的是除了CIVG和之外的变量CIVR不应该应用过滤器,这会得到类似的结果:
Code | funt | farc
------------| -----|---------
CAR | 1 | 2
CBB | 2 | 48
CC | 2 | 40
CIVG | 1 | 19
CIVR | 1 | 54
Run Code Online (Sandbox Code Playgroud)
基本上,过滤器仅适用于我们提供的值,其余数据遵循通常的汇总逻辑。使用 PostgreSQL 可以吗?
只需添加一个条件即可filter:
select code ,
count(1) filter (where value0 > 10000 or code not in ('CIVG', 'CIVR')) as funt,
count(1) ount,
sum(value2) filter (where value0 > 10000 or code not in ('CIVG', 'CIVR')) "farc" ,
sum(value2) "oarc"
from table
group by code
order by code;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8083 次 |
| 最近记录: |