Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:Depósito no Microsoft Fabric
A ANY_VALUE função retorna qualquer valor (não,NULL se possível) de um grupo de linhas. Você pode usá-la como uma função de agregação e uma função de janela (analítica):
- Uso agregado: retorna um valor arbitrário de todo o grupo.
- Uso da janela: opera em um quadro de janela definido e retorna um valor arbitrário de toda a janela.
Convenções de sintaxe de Transact-SQL
Sintaxe
Sintaxe da função de agregação:
ANY_VALUE ( [ ALL | DISTINCT ] expression )
Sintaxe de função analítica:
ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )
Argumentos
ALL
Aplica a função de agregação a todos os valores. ALL é a opção padrão, somente significativa, e está disponível apenas para compatibilidade iso.
DISTINCT
DISTINCT não é significativo com ANY_VALUE, e está disponível apenas para compatibilidade iso.
expressão
O valor a ser retornado. Qualquer um dos valores pode ser retornado como resultado, mas os NULL valores são ignorados, se possível.
Cláusula OVER
O partition_by_clause divide o conjunto de resultados produzido pela FROM cláusula em partições e a função é aplicada a cada partição.
Se você não especificar essa cláusula, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.
A order_by_clause determina a ordem dos dados antes que a função seja aplicada. Se você especificar partition_by_clause, ele determinará a ordem dos dados na partição. O order_by_clause não é necessário.
Para obter mais informações, consulte SELECT – Cláusula OVER (Transact-SQL).
Tipos de retorno
Retorna um valor do mesmo tipo que a expressão.
Observações
ANY_VALUE é não determinístico. Para obter mais informações, confira Funções determinísticas e não determinísticas. Diferente ou FIRST_VALUELAST_VALUEnão, ANY_VALUE não fornece ordenação determinística. Ele foi projetado para casos em que o valor exato não é importante para a lógica de consulta.
A função tenta retornar um valor diferenteNULL quando possível e retorna NULL o valor somente se todos os valores forem NULL.
Caso de uso
Um caso de uso comum é ANY_VALUE quando você precisa incluir colunas não chave em um conjunto de resultados agrupado por uma coluna de chave. Por exemplo, se você agrupar linhas porStoreID, poderá usar ANY_VALUE para retornar valores para colunas como nome do repositório, endereço ou outros atributos descritivos sem adicioná-las GROUP BY à cláusula ou usar funções mais caras como MAX, MINFIRST_VALUEou LAST_VALUE incluí-las na projeção. Essa abordagem simplifica o design da consulta, melhora a legibilidade e melhora o desempenho porque a consulta SQL não precisa executar agrupamento desnecessário nas colunas descritivas. Como resultado, sua agregação permanece concisa, mais fácil de manter e mais eficiente.
Exemplos
A. Recuperar qualquer valor não NULL
Esta consulta simples demonstra como ANY_VALUE pode retornar um valor não NULL arbitrário de um conjunto de valores:
SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);
A função ignora NULL valores e retorna um dos valores que nãoNULL são (às vezes 2, às vezes 7) de forma não determinística.
B. Colunas descritivas do projeto
Essa consulta resume o total de vendas por repositório juntando-se FactSalesDimStorecom, agrupando e recuperando detalhes do StoreKeyrepositório de chaves usando ANY_VALUE.
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;
Aplicando a ANY_VALUE função, você pode incluir colunas de não agrupamento (como StoreName, , StoreDescription, StoreStatus, StorePhone, StoreFax, ZipCode, AddressLine1e AddressLine2) sem listá-las na GROUP BY cláusula.
C. Valores não dinâmicos de linhas para colunas
A FactSales tabela contém uma linha por item de linha, em que OrderKey identifica a ordem. Para cada ordem, atributos como OrderDate, DeliveryDatee CustomerKeyStoreKey são repetidos em todas as linhas que pertencem ao mesmo OrderKey. Por outro lado, ProductKey varia de acordo com o item de linha, com um produto por LineNumber.
A consulta a seguir dinamiza as FactSales linhas para que cada OrderKey uma seja uma única linha. Ele mantém os atributos de nível de pedido compartilhado e cria uma coluna separada (ProductKey0, , ProductKey1...) para o produto associado a cada número de linha. A ANY_VALUE função é usada para escolher um valor representativo de cada grupo, enquanto as expressões condicionais extraem o produto para cada item de linha específico.
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;
Usando a ANY_VALUE função, você evita colocar OrderDate, DeliveryDatee CustomerKeyStoreKey na GROUP BY cláusula. A ANY_VALUE função simplifica a consulta e pode melhorar o desempenho porque apenas uma única coluna (OrderKey) é usada na GROUP BY cláusula.
O ANY_VALUE + CASE WHEN padrão extrai o apropriado ProductKey para cada item de linha e os retorna como colunas separadas. Na prática, esse padrão produz um pivô programático das chaves do produto (uma alternativa ao operador tradicional UNPIVOT ).
D. Valor aleatório por partição de duas colunas
Você está produzindo um relatório de detalhes no nível de vendas com um KPI (indicador de desempenho chave) diário por repositório. No relatório, você precisa retornar a mesma SalesOrderNumber partição por (StoreKey, DateKey) em que nenhuma regra de negócios existe para escolher uma determinada SalesOrderNumber. Não há nenhum requisito para escolher a ordem mais antiga, mais recente ou maior por linha no relatório. Por exemplo, a interface do usuário mostra "uma ordem de referência para o store-day" ao lado de cada linha para que um analista possa rapidamente ir para um pedido do par (loja, dia).
A intenção é retornar um consistente SalesOrderNumber por (repositório, dia).
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;
Se você substituir a ANY_VALUE(fs.SalesOrderNumber) expressão por fs.SalesOrderNumber referência de coluna, o rótulo varia linha por linha; você perde o comportamento "um rótulo consistente por (repositório, dia)".