sql - 当它有/没有特定值时,我如何过滤组并进行聚合?
问题描述
样本数据
id1 | id2 | id3 | col1 | col2
-----------------------------
113 | 10 | 100 | 8 | 10
113 | 10 | 100 | 8 | 20
113 | 10 | 100 | 6 | 30
114 | 10 | 200 | 5 | 40
114 | 10 | 200 | 6 | 50
115 | 10 | 250 | 4 | 60
116 | 10 | 300 | 2 | 70
期望的结果:
id1 | id2 | output
------------------
113 | 10 | 70
114 | 10 | 200
115 | 10 | 250
116 | 10 | 300
计算是这样的。
对于 的每个组合
id1
-如果在 的子组中id2
存在一个值,那么我应该只取具有的特定组,然后执行。进一步解释这一点,因为存在两个子群和。我应该只取子组并进行聚合。如果子组中不存在,请参阅以下项目符号。8
col1
8
output = id3 - sum(col2)
id1=113
id2=10
8
6
col1
8
8
如果
8
子组中不存在这样的 a,我应该这样做output = id3
。注意 -
id3
对于每对id1
和都是唯一的id2
。
我被困在如何在group by
这样的过滤条件下使用 a 。我使用的引擎是 SPARK-SQL。我更喜欢使用 SQL 而不是特定于供应商的命令。
解决方案
试试这个查询:
SELECT
id1,
MAX(id2) AS id2,
CASE WHEN COUNT(CASE WHEN col1 = 8 THEN 1 END) > 0
THEN MAX(id3) - SUM(CASE WHEN col1 = 8 THEN col2 ELSE 0 END)
ELSE MAX(id3) END AS output
FROM yourTable
GROUP BY
id1;
演示
推荐阅读
- c# - 在游戏中实例化太多预制件会使其变慢
- ios - 当键盘从自己的 TextField 切换到另一个 TextField 时,SearchBar RightButton“取消”禁用
- c# - 使用种子数据 Asp.net 核心添加管理员
- java - 如何在 Java/Hibernate 中返回实体的空值
- java - 使用堆栈匹配括号
- python - 我的 python 列表程序由于某种原因无法运行
- json - 如何使用 bash 转换/格式化 json 字符串
- c# - 带有复选框事件的 DataGrid
- bash - 为什么在 OSX Catalina 上使用 bash 的终端中有额外的代码行?
- android - 从第三个活动返回第一个活动并跳过第二个活动