Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:Warehouse w usłudze Microsoft Fabric
Funkcja ANY_VALUE zwraca dowolną (niemożliwąNULL ) wartość z grupy wierszy. Można go użyć zarówno jako funkcji agregującej, jak i funkcji okna (analitycznego):
- Użycie agregacji: zwraca dowolną wartość z całej grupy.
- Użycie okna: działa na zdefiniowanej ramce okna i zwraca dowolną wartość z całego okna.
Transact-SQL konwencje składni
Składnia
Składnia funkcji agregacji:
ANY_VALUE ( [ ALL | DISTINCT ] expression )
Składnia funkcji analitycznej:
ANY_VALUE ( [ ALL | DISTINCT ] expression) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )
Arguments
ALL
Stosuje funkcję agregacji do wszystkich wartości. ALL jest domyślną, tylko zrozumiałą opcją i jest dostępna tylko dla zgodności ISO.
ODMIENNY
DISTINCT nie ma znaczenia w przypadku elementu i jest dostępny tylko w celu zapewnienia zgodności ze standardem ANY_VALUEISO.
wyrażenie
Wartość, która ma zostać zwrócona. W wyniku można zwrócić dowolną z wartości, ale NULL wartości są pomijane, jeśli to możliwe.
Klauzula OVER
Partition_by_clause dzieli zestaw wyników wygenerowany przez klauzulę FROM na partycje, a funkcja jest stosowana do każdej partycji.
Jeśli nie określisz tej klauzuli, funkcja traktuje wszystkie wiersze zestawu wyników zapytania jako pojedynczą grupę.
order_by_clause określa kolejność danych przed zastosowaniem funkcji. Jeśli określisz partition_by_clause, określa kolejność danych w partycji. Order_by_clause nie jest wymagany.
Aby uzyskać więcej informacji, zobacz SELECT - OVER clause (Transact-SQL).
Typy zwracane
Zwraca wartość tego samego typu co wyrażenie.
Uwagi
ANY_VALUE nie jest nieokreślony. Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i niedeterministyczne. W przeciwieństwie do FIRST_VALUE elementu lub LAST_VALUE, ANY_VALUE nie zapewnia określania kolejności deterministycznej. Jest ona przeznaczona dla przypadków, w których dokładna wartość nie jest ważna dla logiki zapytania.
Funkcja próbuje zwrócić wartość inną niżNULL wartość, jeśli jest to możliwe, i zwraca NULL wartość tylko wtedy, gdy wszystkie wartości to NULL.
Przypadek użycia
Typowym przypadkiem ANY_VALUE użycia jest uwzględnienie kolumn innych niżkey w zestawie wyników pogrupowanych według kolumny klucza. Jeśli na przykład grupujesz wiersze według StoreID, możesz użyć ANY_VALUE polecenia , aby zwracać wartości dla kolumn, takich jak nazwa sklepu, adres lub inne atrybuty opisowe bez dodawania ich do GROUP BY klauzuli lub używania droższych funkcji, takich jak MAX, MIN, FIRST_VALUElub LAST_VALUE w celu uwzględnienia ich w projekcji. Takie podejście upraszcza projektowanie zapytań, zwiększa czytelność i zwiększa wydajność, ponieważ zapytanie SQL nie musi wykonywać niepotrzebnych grupowania w kolumnach opisowych. W związku z tym agregacja pozostaje zwięzła, łatwiejsza do utrzymania i wydajniejsza.
Examples
Odp. Pobieranie dowolnej wartości innej niż NULL
To proste zapytanie pokazuje, jak ANY_VALUE można zwrócić dowolną wartość inną niż NULL z zestawu wartości:
SELECT ANY_VALUE(v)
FROM (VALUES (NULL), (NULL), (NULL), (NULL), (2), (NULL), (NULL), (7), (NULL), (NULL)) AS t(v);
Funkcja ignoruje NULL wartości i zwraca jedną z wartości innychNULL niż (czasami 2, czasami 7) w sposób nieokreślony.
B. Kolumny opisowe projektu
To zapytanie podsumowuje łączną sprzedaż na sklep, łącząc się FactSales z elementem DimStore, grupowaniem w witrynie StoreKeyi pobieraniem szczegółów magazynu kluczy przy użyciu polecenia 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;
ANY_VALUE Stosując funkcję, można dołączać kolumny niegrupujące (takie jak StoreName, , StoreFaxStoreStatusZipCodeStoreDescriptionStorePhone, AddressLine1, i AddressLine2) bez wyświetlania ich w klauzuli .GROUP BY
C. Anulowanie przestawiania wartości z wierszy do kolumn
Tabela FactSales zawiera jeden wiersz na element wiersza, w którym OrderKey identyfikuje zamówienie. Dla każdego zamówienia atrybuty, takie jak OrderDate, DeliveryDate, CustomerKeyi StoreKey są powtarzane we wszystkich wierszach należących do tego samego OrderKeyelementu . Natomiast różni się w ProductKey zależności od elementu wiersza, z jednym produktem na LineNumber.
Poniższe zapytanie przewrotnie wiersze FactSales tak, aby każdy z nich OrderKey był pojedynczym wierszem. Przechowuje udostępnione atrybuty na poziomie zamówienia i tworzy oddzielną kolumnę (ProductKey0, ProductKey1, ...) dla produktu skojarzonego z każdym numerem wiersza. Funkcja ANY_VALUE służy do wybierania reprezentatywnej wartości z każdej grupy, podczas gdy wyrażenia warunkowe wyodrębniają produkt dla każdego określonego elementu wiersza.
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;
Korzystając z funkcji, należy unikać umieszczania ANY_VALUEOrderDateklauzuli , DeliveryDate, CustomerKeyi StoreKey w klauzuli GROUP BY . Funkcja ANY_VALUE upraszcza zapytanie i może zwiększyć wydajność, ponieważ w klauzuli jest używana tylko jedna kolumna (OrderKey).GROUP BY
Wzorzec ANY_VALUE + CASE WHEN wyodrębnia odpowiedni ProductKey element wiersza i zwraca je jako oddzielne kolumny. W praktyce ten wzorzec tworzy programowy element przestawny kluczy produktu (alternatywę dla tradycyjnego UNPIVOT operatora).
D. Losowa wartość na dwie kolumny partycji
Tworzysz raport szczegółów na poziomie sprzedaży z dziennym kluczowym wskaźnikiem wydajności (KPI) dla każdego sklepu. W raporcie musisz zwrócić tę samą SalesOrderNumber partycję na partycję (StoreKey, DateKey), w której nie istnieje żadna reguła biznesowa, aby wybrać określony SalesOrderNumberelement . Nie ma potrzeby wybierania najwcześniejszej, najnowszej lub największej kolejności na wiersz w raporcie. Na przykład interfejs użytkownika wyświetla "kolejność referencyjną dnia sklepu" obok każdego wiersza, dzięki czemu analityk może szybko przejść do zamówienia z pary (sklep, dzień).
Intencją jest zwrócenie jednej spójnej SalesOrderNumber na (sklep, dzień).
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;
Jeśli zastąpisz ANY_VALUE(fs.SalesOrderNumber) wyrażenie odwołaniem fs.SalesOrderNumber do kolumny, etykieta zmienia się w wierszu po wierszu; utracisz zachowanie "jedna spójna etykieta na (magazyn, dzień)."
Treści powiązane
- Funkcje agregujące (Transact-SQL)
- funkcje analityczne (Transact-SQL)
- SELECT — klauzula OVER (Transact-SQL)