Заметки по SQL: Создание аналога аналитической функции, которая находит максимальное (минимальное) значение в пределах окна в группе простым запросом

16.03.26

Разработка - Универсальные функции

В статье рассматривается создание аналога аналитической функции, которая находит максимальное (минимальное) значение в пределах окна в группе с использованием простого SQL запроса.

Постановка задачи.

Необходимо сравнить продажи менеджеров с значением продаж самого эффективного менеджера за месяц.

Исходные данные:   

 

 

Результат на выходе:

 

 

 

Решение классическим SQL.

select emp.name,
       emp.val,
       emp.месяц,
       (select max(val) from employees where месяц = emp.месяц) max_val
from employees emp

 

К сожалению, 1С не поддерживает подзапросы в разделе SELECT.

 

Использование аналитической функции:

select emp.name,
       emp.val,
       emp.месяц,
       max(val) over (partition by месяц) max_val
from employees emp

1С не поддерживает такие функции, зато в СКД есть своя – ВычислитьВыражение, но это другая история.

 

Предлагаемое решение:

ВЫБРАТЬ
	148 КАК id,
	410 КАК val,
	"Dgon" КАК name,
	"1" КАК Month,
	ДАТАВРЕМЯ(2026, 1, 1) КАК Data_val
ПОМЕСТИТЬ ВременнаяТаблица

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	130,
	370,
	"Smit",
	"1",
	ДАТАВРЕМЯ(2026, 1, 14)

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	150,
	170,
	"Dgon",
	"2",
	ДАТАВРЕМЯ(2026, 2, 11)

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	153,
	770,
	"Smit",
	"2",
	ДАТАВРЕМЯ(2026, 2, 16)

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	151,
	405,
	"Dgon",
	"3",
	ДАТАВРЕМЯ(2026, 3, 10)

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	153,
	275,
	"Smit",
	"3",
	ДАТАВРЕМЯ(2026, 3, 8)
;

ВЫБРАТЬ
	ВременнаяТаблица.val КАК max_val,
	ВременнаяТаблица.name КАК max_name,
	ВременнаяТаблица2.val КАК val,
	ВременнаяТаблица2.name КАК name,
	ВременнаяТаблица2.Month КАК Month
ИЗ
	ВременнаяТаблица КАК ВременнаяТаблица2
		ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица1
			ПО ВременнаяТаблица.Month = ВременнаяТаблица1.Month
		ПО ВременнаяТаблица2.Month = ВременнаяТаблица.Month

СГРУППИРОВАТЬ ПО
	ВременнаяТаблица.name,
	ВременнаяТаблица.val,
	ВременнаяТаблица2.Month,
	ВременнаяТаблица2.val,
	ВременнаяТаблица2.name

ИМЕЮЩИЕ
	МАКСИМУМ(ВременнаяТаблица1.val) = ВременнаяТаблица.val

УПОРЯДОЧИТЬ ПО
	Month

Анализ  запроса

ВЫБРАТЬ
	ВременнаяТаблица.val КАК val,
	ВременнаяТаблица.name КАК name,
	ВременнаяТаблица.Month КАК Month
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
	ВременнаяТаблица КАК ВременнаяТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица1
		ПО ВременнаяТаблица.Month = ВременнаяТаблица1.Month

СГРУППИРОВАТЬ ПО
	ВременнаяТаблица.Month,
	ВременнаяТаблица.name,
	ВременнаяТаблица.val

ИМЕЮЩИЕ
	МАКСИМУМ(ВременнаяТаблица1.val) = ВременнаяТаблица.val

Условие 

ИМЕЮЩИЕ МАКСИМУМ(ВременнаяТаблица1.val) = ВременнаяТаблица. val

ищет максимальное значение val за месяц.

Если заменить это условие на

ИМЕЮЩИЕ  МИНИМУМ (ВременнаяТаблица1.val) = ВременнаяТаблица. val

то получим минимальное значение за месяц.

ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица

ПО ВременнаяТаблица.месяц = ВременнаяТаблица1.месяц

создаёт окно просмотра.

Такая конструкция позволяет не только получить максимальное значение val за месяц и сразу узнать какому сотруднику оно принадлежит.

Усложним условие.

Предположим за третий месяц два сотрудника продали товара на одинаковую сумму, добавим в первую временную таблицу

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	153,
	405,
	"Garii",
	"3",
	ДАТАВРЕМЯ(2026, 3, 4)

 В результате записи по Garii и Dgon удвоятся.

Чтобы это исключить, добавим условие с минимальной датой записи, определим, кто первый достиг максимума продаж

ВЫБРАТЬ
	ВременнаяТаблица.val КАК max_val,
	ВременнаяТаблица.name КАК max_name,
	ВременнаяТаблица.Data_val КАК Data_val,
	ВременнаяТаблица.Month КАК Month,
	ВременнаяТаблица3.name КАК name,
	ВременнаяТаблица3.val
ИЗ
	ВременнаяТаблица КАК ВременнаяТаблица3
		ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица1
		ПО (ВременнаяТаблица.Month = ВременнаяТаблица1.Month)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВременнаяТаблица КАК ВременнаяТаблица2
		ПО (ВременнаяТаблица.val = ВременнаяТаблица2.val)
	ПО (ВременнаяТаблица3.Month = ВременнаяТаблица.Month)

СГРУППИРОВАТЬ ПО
	ВременнаяТаблица.name,
	ВременнаяТаблица.val,
	ВременнаяТаблица.Data_val,
	ВременнаяТаблица.Month,
	ВременнаяТаблица3.val,
	ВременнаяТаблица3.name

ИМЕЮЩИЕ
	МАКСИМУМ(ВременнаяТаблица1.val) = ВременнаяТаблица.val И
	МИНИМУМ(ВременнаяТаблица2.Data_val) = ВременнаяТаблица.Data_val

УПОРЯДОЧИТЬ ПО
	Month,
Data_val1

Результат

 

 

Примеры применения.

  1. Сравнение производительности сотрудников (подразделений).
  2. Сравнение прибыли (расходов) по месяцам с прибылью максимально эффективного месяца.
  3. Вычисление максимального (минимального) стажа по специальностям
  4. Определение контрагента с максимальной задолженностью.

Вступайте в нашу телеграмм-группу Инфостарт

Запрос SQL

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4237    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    7860    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    53383    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7718    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67909    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9681    ke.92@mail.ru    17    

68
Для отправки сообщения требуется регистрация/авторизация