sql - 从最终结果中过滤掉行,同时仍然使用它们的一些值?
问题描述
举个例子,假设我有一个返回以下结果的视图:
| id | foreignkey | value1 | value2 |
|----|------------|--------|--------|
| 1 | 500 | -100 | 0 |
| 2 | 500 | 900 | 15 |
| 3 | 500 | 570 | 25 |
| 4 | 999 | 100 | 57 |
| 5 | 999 | 150 | 0 |
我试图实现的逻辑如下 -
- 过滤掉所有 value2 = 0 的行。
- 但是,对于 value2 = 0 的行,我需要将它的 value1 添加到具有相同外键的所有其他行的 value1 中,其中 value2 != 0。如果没有其他行具有相同的外键,则具有 value2 的行= 0 只是被过滤掉。
所以在这个例子中,我希望最终结果是
| id | foreignkey | value1 | value2 |
|----|------------|--------|--------|
| 2 | 500 | 800 | 15 |
| 3 | 500 | 470 | 25 |
| 4 | 999 | 250 | 57 |
有任何想法吗?我在想一些group by
可能的事情,但还没有提出解决方案。
解决方案
带SUM()
窗口功能:
select id, foreignkey, value1 + coalesce(total, 0) value1, value2
from (
select *,
sum(case when value2 = 0 then value1 end) over (partition by foreignkey) total
from tablename
) t
where value2 <> 0
见演示。
结果:
> id | foreignkey | value1 | value2
> -: | ---------: | -----: | -----:
> 2 | 500 | 800 | 15
> 3 | 500 | 470 | 25
> 4 | 999 | 250 | 57
推荐阅读
- mysql-workbench - mysql新用户访问数据库被拒绝
- javascript - IE11 不能使用 import * as XXX from XXX
- druid - 如何在apache druid的摄取规范中获取具有最大时间戳的最后一个值?
- r - gsub() 对具有多个替换的数据框中的所有值
- autodesk-forge - OssContriller 无法将文件上传到 BIM 360
- ios - 如何通过 segue 将图像传递到新的视图控制器?
- apache-spark - Pyspark Streaming - 仅从 [window_start, window_end] 显示起始窗口
- c# - LINQ GroupBy 仅在键不为空时选择
- gnuplot - 如何使用 gnuplot 内联颜色列?
- list - Flutter - 参数类型“Iterable>”不能分配给类型“List”