Поделиться через


Агрегатные функции (Entity SQL)

Агрегат — это конструкция языка, которая конденсирует коллекцию в скаляр в рамках групповой операции. Агрегаты Entity SQL доступны в двух формах:

  • Функции коллекции Entity SQL, которые могут использоваться в любом месте выражения. Это включает использование агрегатных функций в проекциях и предикатах, которые действуют в коллекциях. Функции коллекции — это предпочтительный режим указания агрегатов в Entity SQL.

  • Группирует статистические выражения в выражениях запросов с предложением GROUP BY. Как и в Transact-SQL, группы агрегаты принимают DISTINCT и ALL в качестве модификаторов для агрегированных входных данных.

Entity SQL сначала пытается интерпретировать выражение как функцию коллекции и если выражение находится в контексте выражения SELECT, интерпретирует его как агрегат группы.

Entity SQL определяет специальный оператор агрегата с именем GROUPPARTITION. Этот оператор позволяет получить ссылку на группованный входной набор. Это позволяет выполнять более сложные запросы группирования, где результаты предложения GROUP BY можно использовать в местах, отличных от функций статистической обработки или сбора групп.

Функции коллекции

Функции коллекции работают с коллекциями и возвращают скалярное значение. Например, если orders это коллекция всех orders, можно вычислить самую раннюю дату доставки со следующим выражением:

min(select value o.ShipDate from LOB.Orders as o)

Агрегаты групп

Агрегаты групп вычисляются по результату группы, определенному предложением GROUP BY. Предложение GROUP BY секционирует данные в группы. Для каждой группы в результатах применяется агрегатная функция, а отдельный агрегат вычисляется с помощью элементов в каждой группе в качестве входных данных для статистического вычисления. Если предложение GROUP BY используется в выражении SELECT, в предложении ORDER BY могут присутствовать только имена выражений группировки, агрегаты или константы.

В следующем примере вычисляется среднее количество, упорядоченное для каждого продукта.

select p, avg(ol.Quantity) from LOB.OrderLines as ol

group by ol.Product as p

Агрегирование групп можно использовать без явного предложения GROUP BY в выражении SELECT. Все элементы будут рассматриваться как отдельная группа, эквивалентная регистру указания группировки на основе константы.

select avg(ol.Quantity) from LOB.OrderLines as ol

select avg(ol.Quantity) from LOB.OrderLines as ol group by 1

Выражения, используемые в предложении GROUP BY, оцениваются с помощью той же области разрешения имен, которая будет видна выражению предложения WHERE.

См. также