【发布时间】: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