Новость из категории: Информация

SQL Server: агрегатные вычисления с Distinct | Использование ROW_NUMBER

Содержание:
1. Задача и отсутствующий синтаксис;
2. Решение 1. Использование сгруппированных запросов;
3. Решение 2. Использование ROW_NUMBER (Вы читаете данный раздел);
4. Решение 3 и Решение 4;
5. Тест производительности и пакетная обработка.
SQL Server: агрегатные вычисления с Distinct | Использование ROW_NUMBER

Во втором решении (Решение 2) применяется довольно простой подход. Здесь нумеруются строки в каждой отдельной группе, обнуляются все, кроме одного вхождения каждого уникального значения, а затем применяется агрегирование к значениям, отличным от NULL, как регулярная оконная агрегатная функция. В коде ниже приводится полный программный код решения.

SQL Server: агрегатные вычисления с Distinct | Использование ROW_NUMBER
Код Решения 2

Запрос в обобщенном табличном выражении С1 назначает номера строк, чтобы пронумеровать строки в каждом уникальном клиенте и продукте (rownumcust) и номера строк, чтобы пронумеровать строки в каждом уникальном продукте (rownumall). Обратите внимание на использование произвольного оконного упорядочения (ORDER BY (SELECT NULL)), поскольку порядок назначения номеров строк в действительности не имеет значения. Единственное условие — уникальные номера строк назначаются начиная с 1.

Запрос в обобщенном табличном выражении С2 применяет оконные статистические выражения подсчета для фильтрации значений с использованием выражений CASE, которые возвращают только одно вхождение каждого уникального идентификатора продукта, практически обеспечивая подсчет различных объектов. В этом запросе результаты используются для вычисления скидки по номенклатуре, а также вычисления скидки за количество для строки заказа.

Затем внешний запрос вычисляет окончательную скидку строки и группирует и агрегирует результат для вычисления общей скидки клиента. Данный механизм работает столь же четко и также гибок, как современная система умный дом. План для этого запроса (при использовании больших таблиц) показан на рисунке ниже.

SQL Server: агрегатные вычисления с Distinct | Использование ROW_NUMBER
План для Решения 2 в построчном режиме

Данные извлекаются из двух входных базовых таблиц и объединяются только один раз. Номера двух строк вычисляются на основе результата объединения. Однако существует два дорогостоящих шага, на которых результат буферизуется, а затем буфер прочитывается дважды — один раз, чтобы получить подробное состояние данных, и повторно для вычисления статистического выражения подсчета, и результаты объединяются. На одном шаге выполняется вся работа по подсчетам для клиента, а на втором — общий подсчет.

Для выполнения этого запроса на моих компьютерах потребовалось 24 секунды. Основной причиной снижения эффективности была работа, совершаемая с буфером.

SQL Server: агрегатные вычисления с Distinct | Использование ROW_NUMBER

Это решение также может работать с другими функциями с ключевым словом DISTINCT, такими как SUM (DISTINCT...).

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Перевести статью:

Похожие новости

Комментарии

Информация

^ Наверх