GROUPPARTITION (язык Entity SQL)
Возвращает коллекцию значений аргумента, проекция которых получена из текущей секции группы, с которой связано статистическое выражение. Агрегат GroupPartition основан на группе и не имеет формы, основанной на коллекции.
GROUPPARTITION( [ALL|DISTINCT] expression )
Аргументы
- expression
Произвольное выражение Entity SQL .
Замечания
Следующий запрос возвращает список продуктов и коллекцию количеств в строках заказа для каждого продукта:
select p, GroupPartition(ol.Quantity) from LOB.OrderLines as ol
group by ol.Product as p
Следующие два запроса семантически эквивалентны.
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
Оператор GROUPPARTITION может использоваться вместе с определяемыми пользователем агрегатными функциями.
Оператор GROUPPARTITION является специальным агрегатным оператором, который хранит ссылку на сгруппированный входной набор. Эта ссылка может использоваться в любом месте запроса, где в области находится предложение GROUP BY. Например,
select p, GroupPartition(ol.Quantity) from LOB.OrderLines as ol group by ol.Product as p
При использовании обычного предложения GROUP BY результаты группирования скрыты. Эти результаты можно использовать только в агрегатной функции. Чтобы можно было видеть результаты группирования, необходимо сопоставить результаты группирования и входной набор с использованием вложенного запроса. Следующие два запроса эквивалентны.
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
Как показывает этот пример, применение статистического оператора GROUPPARTITION позволяет упростить получение ссылки на входной набор после группирования.
В операторе GROUPPARTITION на входе может указываться любое выражение Entity SQL , если используется параметр expression.
Например, все следующие входные выражения для секции группы являются допустимыми:
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
Пример
В следующем примере показано, как использовать предложение GROUPPARTITION с предложением GROUP BY. Предложение GROUP BY группирует сущности SalesOrderHeader
по их значениям Contact
. Затем предложение GROUPPARTITION находит проекцию свойства TotalDue
для каждой группы, что приводит к получению коллекции десятичных чисел.
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;