Разработчики сделали первый большой шаг на пути реализации в своем продукте функций упорядоченных наборов: они включили в состав пакета функцию STRING_AGG, которая осуществляет конкатенацию строк в группе на основе выбранного порядка.

Еще в 2012 году я написал статью о функциях упорядоченных наборов. В ней отмечалось, что на тот момент в системе SQL Server возможность использования этих функций не была заложена. И вот начиная с версии SQL Server vNext (2017/2018?) CTP 1.1 мы наконец получили средства, обеспечивающие взаимодействие с первой функцией упорядоченных наборов — функцией STRING_AGG. Кроме того, эта функция уже реализована в Azure SQL Database. В настоящей статье я напомню о том, что же, собственно, представляют собой функции упорядоченных наборов, что нового содержит версия vNext и чего в ней пока нет.

Пример функции упорядоченных наборов

Агрегирующие функции широко используются в коде T-SQL, главным образом для решения задач аналитики. Но до сих пор язык T-SQL допускал применение только сгруппированных агрегирующих функций, не определяющих порядок важности. Рассмотрим для примера групповой запрос, приведенный в листинге 1, который рассчитывает значение максимального заказа для каждого клиента. Этот код генерирует выходные данные, показанные на рисунке 1.

 

Результаты работы кода в листинге 1
Рисунок 1. Результаты работы кода в листинге 1

Агрегирующая функция MAX относится к категории общих функций наборов, и в ней упорядоченность по важности не актуальна, иначе говоря, порядок, в котором максимальное значение высчитывается внутри группы, не имеет значения. Вне зависимости от заданного порядка максимальное значение всегда будет одним и тем же. В противоположность этому функция упорядоченных наборов — это агрегирующая функция, предполагающая вычисление значений в определенном порядке. Давайте предположим, что нам требуется выяснить не стоимость максимального заказа для каждого клиента, а стоимость последнего заказа для каждого клиента на основе упорядочения таких показателей, как orderdate и orderid. В стандарте SQL определяется предложение WITHIN GROUP, в котором задается порядок важности для функции упорядоченных наборов. Если бы язык T-SQL обеспечивал возможность работы с функцией упорядоченных сгруппированных наборов LAST_VALUE (сейчас такая возможность отсутствует, но мы будем при рассмотрении данного примера считать ее реальной), задача выполнялась бы таким образом, как показано в листинге 2.

Этот запрос возвратил бы данные, приведенные на рисунке 2.

 

Результаты работы кода в листинге 2
Рисунок 2. Результаты работы кода в листинге 2

В версии SQL Server 2016 язык T-SQL не имеет средств для работы с функциями упорядоченных сгруппированных наборов, но в версии vNext картина меняется.

Агрегация строк

До появления vNext самой востребованной функцией упорядоченных наборов в T-SQL была функция, выполняющая конкатенацию сгруппированных строк. Статья на сайте Connect...

Это не вся статья. Полная версия доступна только подписчикам журнала. Пожалуйста, авторизуйтесь либо оформите подписку.

Поделитесь материалом с коллегами и друзьями

Купить номер с этой статьей в PDF