LINUX.ORG.RU

Как взаимосвязаны между собой оконные функции?

 


0

1

Подготовка:

drop table if exists empsalary;

create table empsalary (
	depname text,
	empno int,
	salary int
);

insert into empsalary values 
	('develop', 11, 5200),
	('develop', 7, 4200),
	('develop', 9, 4500),
	('develop', 8, 6000),
	('develop', 10, 5200),
	('personel', 5, 3500),
	('personel', 2, 3900),
	('sales', 3, 4800),
	('sales', 1, 5000),
	('sales', 4, 4800),
	('develop', 12, 4600);

Раньше никогда не использовал оконные функции. Начал разбираться, понял как работают по отдельности (один over в select). Не пойму как несколько оконных функций вместе работают. Особенно интересно в данном примере почему строка (‘personel’, 5, 3500) вылезла первой.

SELECT depname, empno, salary,
       rank() OVER (PARTITION BY depname ORDER BY salary DESC),
       rank() OVER (PARTITION BY salary ORDER BY empno ASC)
FROM empsalary;

Особенно интересно в данном примере почему строка (‘personel’, 5, 3500) вылезла первой

А какого результата ты ожидал? У тебя в запросе нет сортировки, а это значит, что постгрес тебе мог вернуть первым результатом какую угодно строку из запроса и был бы прав.

Вот тебе пример с сортировкой по одному из рангов:

SELECT depname, empno, salary,
       rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS "rank by salary within department",
       rank() OVER (PARTITION BY salary ORDER BY empno ASC)
FROM empsalary
ORDER BY 4;
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Я этот пример проверил еще и в MySQL и результат тот же.

А вообще как работает несколько over простыми словами, как эти окна сопоставляются/склеиваются?

KRex
() автор топика
Ответ на: комментарий от theNamelessOne

Спасибо, но там в общих чертах и нет объяснения как работает несколько оконных функций в одном запросе

KRex
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.