powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с Over в статистических функциях
7 сообщений из 7, страница 1 из 1
Помогите разобраться с Over в статистических функциях
    #39883387
Satans Claws
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) я правильно понимаю, что конструкция

Код: sql
1.
2.
3.
4.
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Average'
FROM Sales.SalesOrderDetail



равносильна следующей:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select
	s.SalesOrderID, 
	s.ProductID, 
	s.OrderQty,
	gs.Total,
	gs.Average
from
	Sales.SalesOrderDetail s
	Left join 
		(
		select 
			SalesOrderID,
			SUM(OrderQty) Total,
			AVG(OrderQty) Average
		from
			Sales.SalesOrderDetail
		group by
			SalesOrderID
		) gs on gs.SalesOrderID = s.SalesOrderID



2) BOL нифига толком ничего не пишет про order by в over (отсылает на общее описание order by, а там вообще нет ни слова про over), но если я правильно понял, вот такой запрос посчитает сумму нарастающим итогом
Код: sql
1.
2.
3.
4.
5.
SELECT 
    SalesOrderID, 
    ProductID, 
    SUM(OrderQty) OVER(ORDER BY ProductID)
FROM Sales.SalesOrderDetail


т.е. для каждого SalesOrderID набор строк будет отранжирован по ProductID, и для каждого ProductID будет посчитан нарастающий итог по OrderQty

что примерно соответствует такому запросу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT 
    s1.SalesOrderID, 
    s1.ProductID, 
    SUM(s2.OrderQty)
FROM 
	Sales.SalesOrderDetail s
	left join 
		(
			select
				SalesOrderID, 
				ProductID,
				OrderQty
			from
				Sales.SalesOrderDetail
		) s2 on s2.SalesOrderID = s1.SalesOrderID
			and s2.ProductID <= s1.ProductID
Group by
    s1.SalesOrderID, 
    s1.ProductID, 


(точнее, поскольку sum...over строки не сворачивает, к исходному набору строк надо приджойнить посчитанную сумму по SalesOrderID = SalesOrderID and ProductID = ProductID)

если же мы в селект листе напишем
Код: sql
1.
SUM(OrderQty) OVER(ORDER BY SalesOrderID, ProductID)

,
то условие джойна s2 и s1 будет, соответственно
Код: sql
1.
2.
3.
on (s2.SalesOrderID < s1.SalesOrderID) 
	or (s2.SalesOrderID = s1.SalesOrderID
	and s2.ProductID <= s1.ProductID)



Я прав или же серьезно заблуждаюсь?
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883390
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Satans Clawsя правильно понимаю, что конструкция ... равносильна следующей
Ну если не буквоедствовать по поводу разной структуры выходного набора, и при условии, что SalesOrderID не может быть NULL - да.
Satans ClawsBOL нифига толком ничего не пишет про order by в over (отсылает на общее описание order by, а там вообще нет ни слова про over)
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15 Если предложение ORDER BY не указано, то для рамки окна используется весь раздел. Это относится только к тем функциям, которым не требуется предложение ORDER BY. Если предложение ROWS или RANGE не указаны, а указано предложение ORDER BY, то в качестве значения по умолчанию для рамки окна используется RANGE UNBOUNDED PRECEDING AND CURRENT ROW. Это относится только к тем функциям, которые могут принимать дополнительную спецификацию ROWS или RANGE. Например, ранжирующая функция не может принимать предложение ROWS или RANGE, поэтому данная рамка окна не может использоваться, даже несмотря на наличие предложения ORDER BY, а предложение ROWS или RANGE отсутствует.
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883414
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Satans Clawsя правильно понимаю, что конструкция
равносильна следующей:


Поверхностно, как результат вывода - да. Но все же оконные функции производительней, - так как имеет место быть порядок выполнения конструкций и операторов под капотом - оконные функции прозрачно применяются к уже полученному результирующему набору в памяти, в следствии чего и появляется возможность, применять в блоке SELECT разные агрегации секций построчно, независимо друг от друга.
Таким образом - отпадают лишние чтения и операции обращения к таблицам, как те, что во втором случае через LEFT JOIN.
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883430
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Satans Claws,

1)да
2)
Код: sql
1.
(OrderQty) OVER(ORDER BY ProductID)


Это краткая запись более полной конструкции
Код: sql
1.
(OrderQty) OVER(ORDER BY ProductID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)



посмотрите как работает ROWS BETWEEN
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883431
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё для некоторых сюрпризом является вот такая конструкция

Код: sql
1.
SUM(OrderQty) OVER() AS 'Total'
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883442
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninSatans Claws,

1)да
2)
Код: sql
1.
(OrderQty) OVER(ORDER BY ProductID)



Это краткая запись более полной конструкции
Код: sql
1.
(OrderQty) OVER(ORDER BY ProductID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)




посмотрите как работает ROWS BETWEENЭто неверно, поскольку по умолчанию - RANGE, а не ROWS. Как это ни странно и очень печально.
...
Рейтинг: 0 / 0
Помогите разобраться с Over в статистических функциях
    #39883449
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

Да действительно RANGE, но в данном примере это роли не играет
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с Over в статистических функциях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]