ANY_VALUE

ANY_VALUE (임의 값)

그룹에서 표현식의 어떤 값 하나를 반환해요. 결과는 비결정적(non-deterministic)이에요.

출처: Snowflake SQL Reference - ANY_VALUE

본문

구문

집계 함수:

ANY_VALUE( [ DISTINCT ] <expr1> )

윈도우 함수:

ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )

인자

expr1

입력 표현식이에요.

expr2

결과를 여러 파티션으로 나누고 싶을 때 파티션 기준이 되는 열이에요.

반환 값

이 함수는 어떤 데이터 타입의 값이든 반환할 수 있어요.

입력 표현식이 NULL이면 함수는 NULL을 반환해요.

사용 시 참고 사항

  • 이 함수에 DISTINCT 키워드를 지정할 수 있지만, 효과는 없어요.

  • 이 함수는 NULL 값을 제외하지 않아요. 표현식에 NULL 값이 있으면 함수는 NULL 값을 반환할 수 있어요.

  • 이 함수를 윈도우 함수로 호출할 때는 다음을 지원하지 않아요.

    • OVER 절 안의 ORDER BY 절.

    • 명시적 윈도우 프레임(window frame).

GROUP BY 문과 ANY_VALUE 사용하기

ANY_VALUE는 GROUP BY 문의 성능을 단순화하고 최적화할 수 있어요. 많은 쿼리에서 흔한 문제는, GROUP BY 절이 있는 쿼리의 결과는 GROUP BY 절 자체에 사용된 표현식 또는 집계 함수의 결과만 포함할 수 있다는 점이에요. 예를 들어:

SELECT customer.id , customer.name , SUM(orders.value)
 FROM customer
 JOIN orders ON customer.id = orders.customer_id
 GROUP BY customer.id , customer.name;

이 쿼리에서 customer.name 속성은 결과에 포함되려면 GROUP BY에 있어야 해요. 이는 불필요할 때가 많고(예: customer.id가 고유하다고 알려진 경우) 계산을 더 복잡하고 느리게 만들 수 있어요. 또 다른 방법은 집계 함수를 사용하는 것이에요. 예를 들어:

SELECT customer.id , MIN(customer.name) , SUM(orders.value)
 FROM customer
 JOIN orders ON customer.id = orders.customer_id
 GROUP BY customer.id;

이렇게 하면 GROUP BY 절이 단순해지지만, 여전히 MIN 함수 계산이 필요해 추가 비용이 들어요.

ANY_VALUE를 사용하면 다음 쿼리를 실행할 수 있어요.

SELECT customer.id , ANY_VALUE(customer.name) , SUM(orders.value)
 FROM customer
 JOIN orders ON customer.id = orders.customer_id
 GROUP BY customer.id;

더 알아보기