비집계 표현식 <expression>는 GROUP BY 절에 참여하지 않는 열들을 기반으로 합니다.
열이나 식을 GROUP BY에 추가하고, 식을 집계하거나, 그룹 내의 값 중 반환되는 특정 값을 신경 쓰지 않는다면 <expressionAnyValue>을 사용합니다.
매개 변수
-
식:
SELECT목록에서 비 집계, 비 그룹화 식입니다. -
expressionAnyValue: any_value() 집계 함수로 감싸진
expression.
설명
GROUP BY 절이 있는 쿼리 컨텍스트 내에서 SELECT 목록의 로컬 열 참조는 다음과 여야 합니다.
- 집계 함수의 인수로 소모되거나
-
GROUP BY절의 식과 일치하는 표현의 일부입니다.
로컬 열 참조는 쿼리의 FROM 절에서 테이블 참조로 확인된 열입니다.
즉, 열 참조는 그룹화 키의 일부이거나 집계의 일부여야 합니다.
Azure Databricks는 최선의 노력식과 일치합니다. 예를 들어 SELECT c1 + 5 FROM T GROUP BY 5 + c1 수학 식으로 인식합니다.
그러나 SELECT c1 FROM T GROUP BY c1 + 5는 일치하지 않습니다.
완화 방법
오류 완화는 원인에 따라 달라집니다.
그룹화 열을 놓쳤나요?
expression또는expression의 관련 하위 표현을GROUP BY절에 추가하십시오.열 참조가
GROUP BY와 다른epression식의 일부인가요?SELECT목록의 식을 일치시키거나GROUP BY식을 단순화합니다.집계를 놓치고 있나요?
열 참조를 집계 함수로 래핑합니다. 그룹의 대표 값만 원하는 경우 any_value(epression)사용할 수 있습니다.
예제
-- Sample data
> CREATE OR REPLACE TEMPORARY VIEW tasks(name, firstname, task, cost) AS
VALUES ('Smith' , 'Sam' , 'UNPIVOT', 10),
('Smith' , 'Sam' , 'LATERAL', 5),
('Shuster', 'Sally' , 'DELETE' , 7),
('Shuster', 'Sally' , 'GRANT' , 8);
-- `name` and `firstname` are part of the group by coumns, but incomplete
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
[MISSING_AGGREGATION] The expression "name" is neither present in the group by, nor is it an aggregate function.
-- Match the GROUP BY expression
> SELECT firstname || ' ' || name, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
Sam Smith 15
Sally Shuster 15
-- Break up the GROUP BY expression
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
Sam Smith 15
Sally Shuster 15
-- Missing grouping column
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY name;
[MISSING_AGGREGATION] The expression "firstname" is neither present in the group by, nor is it an aggregate function.
-- Add the grouping column
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
Sam Smith 15
Sally Shuster 15
-- Missing aggregate
> SELECT firstname, name, sum(cost), task FROM tasks GROUP BY firstname, name;
[MISSING_AGGREGATION] The expression "task" is neither present in the group by, nor is it an aggregate function.
-- Add an aggregate
> SELECT firstname, name, sum(cost), array_agg(task) FROM tasks GROUP BY firstname, name;
Sam Smith 15 ["UNPIVOT","LATERAL"]
Sally Shuster 15 ["DELETE","GRANT"]
-- Return any task
> SELECT firstname, name, sum(cost), any_value(task) FROM tasks GROUP BY firstname, name;
Sam Smith 15 LATERAL
Sally Shuster 15 DELETE