Этот вопрос связан с условным агрегированием в SQL. Обычно мы помещаем условия, используя оператор case в предложении select, но это условие 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», вообще не выполняйте агрегирование «сумма».
Вкратце, ожидаемый результат для вышеуказанного сценария:
M1|0
M2|0
M3|5
Ответы в Spark SQL высоко ценятся.