적용 대상:Microsoft Fabric의 웨어하우스
이 함수는 ANY_VALUE 행 그룹에서 가능한 경우 아닌NULL 값을 반환합니다. 집계 함수와 창(분석) 함수로 사용할 수 있습니다.
- 집계 사용량: 전체 그룹의 임의 값을 반환합니다.
- 창 사용: 정의된 창 프레임에서 작동하고 전체 창에서 임의의 값을 반환합니다.
문법
집계 함수 구문:
ANY_VALUE ( [ ALL | DISTINCT ] expression )
분석 함수 구문:
ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )
Arguments
전체
모든 값에 집계 함수를 적용합니다. ALL은 의미 있는 기본 옵션이며 ISO 호환성에서만 사용할 수 있습니다.
독특한
DISTINCT 는 의미가 ANY_VALUE없으며 ISO 호환성에서만 사용할 수 있습니다.
expression
반환되는 값입니다. 모든 값은 결과로 반환될 수 있지만 NULL 가능한 경우 값을 건너뜁습니다.
OVER 절
partition_by_clause 절에서 생성된 결과 집합을 FROM 파티션으로 나누고 함수가 각 파티션에 적용됩니다.
이 절을 지정하지 않으면 함수는 쿼리 결과 집합의 모든 행을 단일 그룹으로 처리합니다.
order_by_clause는 함수를 적용하기 전에 데이터의 순서를 결정합니다. partition_by_clause 지정하면 파티션의 데이터 순서가 결정됩니다. order_by_clause 필요하지 않습니다.
자세한 내용은 SELECT - OVER 절(Transact-SQL)을 참조하세요.
반환 형식
식과 동일한 형식의 값을 반환합니다.
비고
ANY_VALUE는 비결정적입니다. 자세한 내용은 결정적 함수와 비결정적 함수를 참조하세요. 달리 FIRST_VALUE 또는 LAST_VALUE, ANY_VALUE 결정적 순서를 제공하지 않습니다. 정확한 값이 쿼리 논리에 중요하지 않은 경우를 위해 설계되었습니다.
이 함수는 가능한 경우 비값NULL 을 반환하려고 시도하고 모든 값이 있는 경우에만 값을 반환 NULL 합니다 NULL.
사용 사례
일반적인 사용 사례는 키 열로 그룹화된 결과 집합에 키가 아닌 열을 포함해야 하는 경우 ANY_VALUE 입니다. 예를 들어 행을 그룹화하는 경우 절에 StoreID추가하거나 더 비싼 함수(예MAX: ,FIRST_VALUEMIN)를 사용하지 않고 GROUP BY 저장소 이름, 주소 또는 기타 설명 특성과 같은 열에 대한 값을 반환하거나 LAST_VALUE 프로젝션에 포함할 수 ANY_VALUE 있습니다. 이 방법은 SQL 쿼리가 설명 열에서 불필요한 그룹화 작업을 수행할 필요가 없으므로 쿼리 디자인을 간소화하고 가독성을 향상시키며 성능을 향상시킵니다. 결과적으로 집계는 간결하고 유지 관리가 쉽고 효율적입니다.
예제
A. NULL이 아닌 값 검색
이 간단한 쿼리는 값 집합에서 임의의 비 NULL 값을 반환하는 방법을 ANY_VALUE 보여 줍니다.
SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);
이 함수는 값을 무시하고 NULL 비결정적인 방식으로 비값NULL (때로는 2, 때로는 7) 중 하나를 반환합니다.
B. 프로젝트 설명 열
이 쿼리는 을 사용하여 ANY_VALUE조인, 그룹화 StoreKey및 키 저장소 세부 정보를 검색하여 저장소 FactSalesDimStore당 총 매출을 요약합니다.
USE ContosoDW;
GO
SELECT
fs.StoreKey,
ANY_VALUE(ds.StoreName) AS StoreName,
ANY_VALUE(ds.StoreDescription) AS StoreDescription,
ANY_VALUE(ds.Status) AS StoreStatus,
ANY_VALUE(ds.Phone) AS StorePhone,
ANY_VALUE(ds.Fax) AS StoreFax,
ANY_VALUE(ds.ZipCode) AS ZipCode,
ANY_VALUE(ds.AddressLine1) AS AddressLine1,
ANY_VALUE(ds.AddressLine2) AS AddressLine2,
SUM(fs.UnitPrice * fs.SalesQuantity) AS SalesAmount
FROM dbo.FactSales AS fs
LEFT JOIN dbo.DimStore AS ds
ON ds.StoreKey = fs.StoreKey
GROUP BY
fs.StoreKey;
함수를 적용하면 ANY_VALUE 절에 나열하지 않고 그룹화하지 않는 열(예: StoreName, StoreDescription,StoreStatusStorePhone, StoreFax, ZipCode, AddressLine1및AddressLine2)을 GROUP BY 포함할 수 있습니다.
C. 행에서 열로 값 피벗 해제
테이블에는 FactSales 순서를 식별하는 행 항목 OrderKey 당 하나의 행이 포함됩니다. 각 순서에 대해 , , CustomerKeyDeliveryDate등의 OrderDate특성이 StoreKey 동일한 OrderKey행에 속하는 모든 행에서 반복됩니다. 반면, ProductKey 품목에 따라 다르며, 제품당 LineNumber하나의 제품이 있습니다.
다음 쿼리는 각 OrderKey 행이 FactSales 단일 행이 되도록 행을 피벗합니다. 공유 순서 수준 특성을 유지하고 각 줄 번호와 연결된 제품에 대해 별도의 열(ProductKey0, ProductKey1, ...)을 만듭니다. 이 ANY_VALUE 함수는 각 그룹에서 대표 값을 선택하는 데 사용되고 조건식은 각 특정 품목에 대한 제품을 추출합니다.
SELECT
OrderKey,
-- Projecting groups that are same within the group.
ANY_VALUE(OrderDate) AS OrderDate,
ANY_VALUE(DeliveryDate) AS DeliveryDate,
ANY_VALUE(CustomerKey) AS CustomerKey,
ANY_VALUE(StoreKey) AS StoreKey,
-- Unpivoted values returned as multiple columns per row
ANY_VALUE(IIF(LineNumber = 0, ProductKey, NULL)) AS ProductKey0,
ANY_VALUE(IIF(LineNumber = 1, ProductKey, NULL)) AS ProductKey1,
ANY_VALUE(IIF(LineNumber = 2, ProductKey, NULL)) AS ProductKey2,
ANY_VALUE(IIF(LineNumber = 3, ProductKey, NULL)) AS ProductKey3,
ANY_VALUE(IIF(LineNumber = 4, ProductKey, NULL)) AS ProductKey4,
ANY_VALUE(IIF(LineNumber = 5, ProductKey, NULL)) AS ProductKey5,
ANY_VALUE(IIF(LineNumber = 6, ProductKey, NULL)) AS ProductKey6
FROM dbo.FactSales
GROUP BY
OrderKey;
함수를 ANY_VALUE 사용하면 절에 , DeliveryDate및 CustomerKeyStoreKey 절을 배치OrderDate하지 GROUP BY 않습니다. 이 함수는 ANY_VALUE 쿼리를 간소화하고 절에 GROUP BY 단일 열(OrderKey)만 사용되므로 성능을 향상시킬 수 있습니다.
패턴은 ANY_VALUE + CASE WHEN 각 품목에 ProductKey 적합한 항목을 추출하고 별도의 열로 반환합니다. 실제로 이 패턴은 제품 키의 프로그래밍 피벗(기존 UNPIVOT 연산자의 대안)을 생성합니다.
D. 두 열 파티션당 임의 값
매장당 일일 KPI(핵심 성과 지표)를 사용하여 판매 수준 세부 보고서를 생성합니다. 보고서에서 특정SalesOrderNumber을 선택하기 위해 비즈니스 규칙이 없는 동일한 SalesOrderNumber 파티션당(StoreKey, DateKey) 파티션을 반환해야 합니다. 보고서에서 줄당 가장 빠른 순서, 최신 또는 최대 순서를 선택할 필요가 없습니다. 예를 들어 사용자 인터페이스는 각 줄 옆에 "store-day에 대한 참조 주문"을 표시하므로 분석가가 (매장, 일) 쌍의 주문으로 빠르게 이동할 수 있습니다.
의도는 (저장소, 일) 당 하나의 일관성 SalesOrderNumber 을 반환하는 것입니다.
USE ContosoDW;
GO
SELECT
fs.DateKey,
fs.StoreKey,
-- Window KPI: total sales per Store-Day (keeps row-level output)
SUM(fs.UnitPrice * fs.SalesQuantity)
OVER (PARTITION BY fs.StoreKey, dd.DateKey) AS DailySales,
-- Partition label with no preferred ordering: any one order from that Store-Day
ANY_VALUE(fs.SalesOrderNumber)
OVER (PARTITION BY fs.StoreKey, dd.DateKey) AS SampleOrderNumber
FROM dbo.FactSales AS fs;
식을 열 참조로 fs.SalesOrderNumber 바꾸 ANY_VALUE(fs.SalesOrderNumber) 면 레이블이 행 단위로 달라지므로 "(store, day)당 하나의 일관된 레이블" 동작이 손실됩니다.