首页 > 解决方案 > 当它有/没有特定值时,我如何过滤组并进行聚合?

问题描述

样本数据

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

计算是这样的。

我被困在如何在group by这样的过滤条件下使用 a 。我使用的引擎是 SPARK-SQL。我更喜欢使用 SQL 而不是特定于供应商的命令。

在 dba stackexchange 的这个问题中问了类似的问题

标签: sqlgroup-by

解决方案


试试这个查询:

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;

在此处输入图像描述

演示


推荐阅读