GROUPPARTITION (Entity SQL)
Zwraca kolekcję wartości argumentów, które są przewidywane poza bieżącą partycję grupy, do której jest powiązana agregacja. Agregacja GroupPartition
jest agregacja oparta na grupach i nie ma formularza opartego na kolekcji.
Składnia
GROUPPARTITION( [ALL|DISTINCT] expression )
Argumenty
expression
Dowolne wyrażenie Języka SQL jednostki.
Uwagi
Następujące zapytanie tworzy listę produktów i kolekcję ilości wierszy zamówień na każdy produkt:
SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol
GROUP BY ol.Product AS p
Następujące dwa zapytania są semantycznie równe:
SELECT p, Sum(GroupPartition(ol.Quantity)) FROM LOB.OrderLines AS ol
GROUP BY ol.Product AS p
SELECT p, Sum(ol.Quantity) FROM LOB.OrderLines AS ol
group by ol.Product as p
Operator GROUPPARTITION
może być używany w połączeniu z funkcjami agregacji zdefiniowanymi przez użytkownika.
GROUPPARTITION
jest specjalnym operatorem agregacji, który zawiera odwołanie do zgrupowanego zestawu danych wejściowych. To odwołanie może być używane w dowolnym miejscu w zapytaniu, w którym element GROUP BY znajduje się w zakresie. Na przykład:
SELECT p, GroupPartition(ol.Quantity) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p
W przypadku zwykłego GROUP BY
elementu wyniki grupowania są ukryte. Wyniki można używać tylko w funkcji agregującej. Aby wyświetlić wyniki grupowania, należy skorelować wyniki grupowania i zestaw danych wejściowych przy użyciu podzapytania. Następujące dwa zapytania są równoważne:
SELECT p, (SELECT q FROM GroupPartition(ol.Quantity) AS q) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p
SELECT p, (SELECT ol.Quantity AS q FROM LOB.OrderLines AS ol2 WHERE ol2.Product = p) FROM LOB.OrderLines AS ol GROUP BY ol.Product AS p
Jak pokazano w przykładzie, operator agregacji GROUPPARTITION ułatwia uzyskanie odwołania do zestawu danych wejściowych po zgrupowaniu.
Operator GROUPPARTITION może określić dowolne wyrażenie Entity SQL w danych wejściowych operatora podczas korzystania z parametru expression
.
Na przykład wszystkie następujące wyrażenia wejściowe partycji grupy są prawidłowe:
SELECT groupkey, GroupPartition(b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(1) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(a + b) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({a + b}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition({42}) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
SELECT groupkey, GroupPartition(b > a) FROM {1,2,3} AS a INNER JOIN {4,5,6} AS b ON true GROUP BY a AS groupkey
Przykład
W poniższym przykładzie pokazano, jak używać klauzuli GROUPPARTITION z klauzulą GROUP BY. Klauzula GROUP BY grupuje SalesOrderHeader
jednostki według ich Contact
. Klauzula GROUPPARTITION następnie projektuje TotalDue
właściwość dla każdej grupy, co powoduje kolekcję miejsc dziesiętnych.
USING Microsoft.Samples.Entity
Function MyAvg(dues Collection(Decimal)) AS
(
Avg(SELECT value due FROM dues AS due WHERE due > @price)
)
SELECT TOP(10) contactID, MyAvg(GroupPartition(order.TotalDue))
FROM AdventureWorksEntities.SalesOrderHeaders AS order
GROUP BY order.Contact.ContactID AS contactID;