【问题标题】:Condition while aggregation in SparkSpark中聚合时的条件
【发布时间】:2019-04-07 14:13:46
【问题描述】:

这个问题与 SQL 的条件聚合有关。通常我们在 select 子句中使用“case”语句放置条件,但该 case 条件仅检查正在考虑的行。考虑以下数据:

BEGIN TRANSACTION;

/* Create a table called NAMES */
CREATE TABLE NAMES(M CHAR, D CHAR, A INTEGER);

/* Create few records in this table */
INSERT INTO NAMES VALUES('M1','Y',2);
INSERT INTO NAMES VALUES('M1','Y',3);
INSERT INTO NAMES VALUES('M2','Y',2);
INSERT INTO NAMES VALUES('M2',null,3);
INSERT INTO NAMES VALUES('M3',null,2);
INSERT INTO NAMES VALUES('M3',null,3);
COMMIT;

此查询使用列“M”进行分组,并检查列“D”是否为空(分别针对每条记录)并将总和聚合放在列“A”上。

select sum(case when D = 'Y' then 0 else A end) from NAMES group by M;

这个查询的输出是:

M1|0
M2|3
M3|5

但是,如果我们想检查组中每条记录的“D”列是否为空。如果组中的任何记录为“Y”,则根本不执行“sum”聚合。 简而言之,上述场景的预期输出是:

M1|0
M2|0
M3|5

非常感谢 Spark SQL 中的答案。

【问题讨论】:

    标签: sql apache-spark apache-spark-sql aggregate-functions


    【解决方案1】:

    您可以使用另一个case 表达式:

    select (case when max(D) = min(D) and max(D) = 'Y'  -- all the same
                 then sum(case when D = 'Y' then 0 else A end)
                 else 0
            end)
    from NAMES
    group by M;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2020-02-18
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多