Udostępnij za pośrednictwem


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 BYelementu 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;