powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с поризводительностью запроса.
8 сообщений из 33, страница 2 из 2
Помогите с поризводительностью запроса.
    #38981310
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukУвы... не решается задача через WINDOW FUNCTIONS просто потому что набор условий в подзапросе не задает реализуемое условие сортировки.
Так как вот для 2х пар: rankGid rankZak
p1(1,2) и p2(2,1) нельзя сказать что по условию которое в подзапросе что p1>p2 и так же нельзя сказать что p2>p1
и при этом они не равны. А значит отсортировать невозможно а значит COUNT(*) на оконную функцию не заменяется.

--
Maxim Boguk
www.postgresql-consulting.ru

И я о том же, вы просто грамотнее расписали.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981312
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukvadipok В этом примере тоже видно, что он работает не так, как мне надо.

В общем решение задачи через window functions сводится к придумыванию такой order by конструкции которая бы соответствовала сортировке по t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak
Забавно вроде и простая задача но в лоб пока не решается.

--
Maxim Boguk
www.postgresql-consulting.ru
не вдаваясь -- обычно это сорт по нормальному интервалу (С не строгим неравенством по первому измерению)+ выкалывающее условие case_when в агрегате (окне).
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981317
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqvadipokЩукина Анна,

nskv nskvz gid zak rankgid lx rankzak ly d alpha

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
WITH t (nskv, nskvz, gid, zak, rankgid, lx, rankzak, ly, d, alpha) AS (VALUES
('1018','14096',3.09677419354839,23.3876221498371,2.0000000000000000,1,1.00000000000000000000,1,777,106)
,('1018','14096',3.70967741935484,28.1623931623932,7.0000000000000000,1,2.0000000000000000,1,777,106)
,('1018','14096',3.53896103896104,28.8666666666667,3.0000000000000000,1,3.0000000000000000,1,777,106)
,('1018','14096',5.1,29.5145631067961,11.0000000000000000,1,4.0000000000000000,1,777,106)
,('1018','14096',5.01960784313725,32.6229508196721,10.0000000000000000,1,5.0000000000000000,1,777,106)
,('1018','14096',3.67741935483871,32.8155339805825,5.0000000000000000,1,6.0000000000000000,1,777,106)
,('1018','14096',3.55987055016181,33.7218045112782,4.0000000000000000,1,7.0000000000000000,1,777,106)
,('1018','14096',3.7012987012987,43.7423312883436,6.0000000000000000,1,8.0000000000000000,1,777,106)
,('1018','14096',3.7248322147651,45.0694444444444,8.0000000000000000,1,9.0000000000000000,1,777,106)
,('1018','14096',5.2258064516129,45.4824561403509,12.0000000000000000,1,10.0000000000000000,1,777,106)
,('1018','14096',2.35294117647059,55.6493506493507,1.00000000000000000000,1,11.0000000000000000,1,777,106)
,('1018','14096',3.73333333333333,58.7155963302752,9.0000000000000000,1,12.0000000000000000,1,777,106)
,('1018','18963',3.70967741935484,23.906976744186,6.0000000000000000,1,1.00000000000000000000,1,278,34)
,('1018','18963',5.2258064516129,28.110599078341,11.0000000000000000,1,2.0000000000000000,1,278,34)
,('1018','18963',5.1,30.873786407767,10.0000000000000000,1,3.0000000000000000,1,278,34)
,('1018','18963',3.53896103896104,32.2382671480144,3.0000000000000000,1,4.0000000000000000,1,278,34)
,('1018','18963',3.7012987012987,36.3803680981595,5.0000000000000000,1,5.0000000000000000,1,278,34)
,('1018','18963',3.55987055016181,37.6691729323308,4.0000000000000000,1,6.0000000000000000,1,278,34)
,('1018','18963',2.35294117647059,38.159509202454,1.00000000000000000000,1,7.0000000000000000,1,278,34)
,('1018','18963',3.73333333333333,39.0825688073394,8.0000000000000000,1,8.0000000000000000,1,278,34)
,('1018','18963',5.01960784313725,44.6440677966102,9.0000000000000000,1,9.0000000000000000,1,278,34)
,('1018','18963',3.7248322147651,53.1597222222222,7.0000000000000000,1,10.0000000000000000,1,278,34)
)
SELECT * FROM t;



-- кактотак

+100500, в другой раз.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981492
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

да, трудно не согласиться с тем, что окна притянуть к задаче не получилось.

в качестве альтернативы предлагаю, всё же, попробовать отойти от формы коррелированного подзапроса во фразе Select к форме с джойном.
возможно, на неиндексированных наборах данных она будет быстрее подзапросов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t0.*,
       sum(case when t0.rankZak < t1.rankZak then 1 else 0 end) as Splus,
       sum(case when t0.rankZak > t1.rankZak then 1 else 0 end) as Sminus
  FROM portal.tempCorelation2 t0
  left join
       portal.tempCorelation2 t1
    on t0.nskv = t1.nskv
   AND t0.nskvZ = t1.nskvZ
   AND t0.rankGid < t1.rankGid
  group by t0.nskv, t0.nskvz, t0.gid, t0.zak, t0.rankgid, t0.lx, t0.rankzak, t0.ly, t0.d, t0.alpha
  order by 1,2,5,7;
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981501
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

ещё, как вариант, можно смотреть в сторону LATERAL-ных подзапросов. Но, по сути, это будет что-то среднее между джойном и коррелированным подзапросом. Из плюсов будет отсутствие группировки (которая есть в варианте с джойном) и получение обоих вычисляемых значений за одно обращение к таблице, из минусов - та же самая коррелированность и повторное выполнение вычислений для каждой строки исходной таблицы portal.tempCorelation2, что и в случае с подзапросами во фразе Select
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38981993
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Понял, спасибо!
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38982387
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

В приведенном примере тестовых данных комбинация (nskv, nskvz, rankzak) уникальна. Действительно ли это условие выполняется? Кажется, это могло бы помочь.
...
Рейтинг: 0 / 0
Помогите с поризводительностью запроса.
    #38982680
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

ковыряя в носу (не факт что это быстро)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
WITH ti (nskv, nskvz, gid, zak, rankgid, lx, rankzak, ly, d, alpha) AS (VALUES
('1018','14096',3.09677419354839,23.3876221498371,2.0000000000000000,1,1.00000000000000000000,1,777,106)
,('1018','14096',3.70967741935484,28.1623931623932,7.0000000000000000,1,2.0000000000000000,1,777,106)
,('1018','14096',3.53896103896104,28.8666666666667,3.0000000000000000,1,3.0000000000000000,1,777,106)
,('1018','14096',5.1,29.5145631067961,11.0000000000000000,1,4.0000000000000000,1,777,106)
,('1018','14096',5.01960784313725,32.6229508196721,10.0000000000000000,1,5.0000000000000000,1,777,106)
,('1018','14096',3.67741935483871,32.8155339805825,5.0000000000000000,1,6.0000000000000000,1,777,106)
,('1018','14096',3.55987055016181,33.7218045112782,4.0000000000000000,1,7.0000000000000000,1,777,106)
,('1018','14096',3.7012987012987,43.7423312883436,6.0000000000000000,1,8.0000000000000000,1,777,106)
,('1018','14096',3.7248322147651,45.0694444444444,8.0000000000000000,1,9.0000000000000000,1,777,106)
,('1018','14096',5.2258064516129,45.4824561403509,12.0000000000000000,1,10.0000000000000000,1,777,106)
,('1018','14096',2.35294117647059,55.6493506493507,1.00000000000000000000,1,11.0000000000000000,1,777,106)
,('1018','14096',3.73333333333333,58.7155963302752,9.0000000000000000,1,12.0000000000000000,1,777,106)
,('1018','18963',3.70967741935484,23.906976744186,6.0000000000000000,1,1.00000000000000000000,1,278,34)
,('1018','18963',5.2258064516129,28.110599078341,11.0000000000000000,1,2.0000000000000000,1,278,34)
,('1018','18963',5.1,30.873786407767,10.0000000000000000,1,3.0000000000000000,1,278,34)
,('1018','18963',3.53896103896104,32.2382671480144,3.0000000000000000,1,4.0000000000000000,1,278,34)
,('1018','18963',3.7012987012987,36.3803680981595,5.0000000000000000,1,5.0000000000000000,1,278,34)
,('1018','18963',3.55987055016181,37.6691729323308,4.0000000000000000,1,6.0000000000000000,1,278,34)
,('1018','18963',2.35294117647059,38.159509202454,1.00000000000000000000,1,7.0000000000000000,1,278,34)
,('1018','18963',3.73333333333333,39.0825688073394,8.0000000000000000,1,8.0000000000000000,1,278,34)
,('1018','18963',5.01960784313725,44.6440677966102,9.0000000000000000,1,9.0000000000000000,1,278,34)
,('1018','18963',3.7248322147651,53.1597222222222,7.0000000000000000,1,10.0000000000000000,1,278,34)
)
,t AS (SELECT *, row_number() over() AS rk FROM ti)
,FOO AS (SELECT 
	t.nskv, 
	t.nskvZ, 
	t.d,
	t.alpha, 
	t.rankGid,
	t.rankZak,
	t.lx,
	t.ly
	,(SELECT COUNT(1) FROM t t1 WHERE t1.nskv = t.nskv AND t.nskvZ = t1.nskvZ AND t.rankGid < t1.rankGid AND t.rankZak < t1.rankZak) as Splus
	,COUNT(1) OVER(PARTITION BY nskv,nskvZ) "all"	--all
		,count(1) OVER(PARTITION BY nskv,nskvZ ORDER BY rankGid) A--<=rankGid A
		,ARRAY_agg(rk) OVER(PARTITION BY nskv,nskvZ ORDER BY rankGid) AA--<=rankGid A
		,count(1) OVER(PARTITION BY nskv,nskvZ ORDER BY rankZak) B--<=rankZak B
		,ARRAY_agg(rk) OVER(PARTITION BY nskv,nskvZ ORDER BY rankZak) AB--<=rankZak B

FROM t 
)
SELECT 
	t.nskv, 
	t.nskvZ, 
	t.d,
	t.alpha, 
	t.rankGid,
	t.rankZak,
	t.lx,
	t.ly
	,Splus
	,"all"
		- a
		-b
			+ (SELECT count(1) FROM unnest(aa) u(u) JOIN unnest(ab) v(v) ON u =v) -- "квадратичный член"
FROM FOO t
;


-- думаю, это скорее медленно и печально, чем наоборот.

но такое вот разложение придумалось.
если научиться извлекать "квадратичный член" на первом проходе -- было бы неплохо.
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с поризводительностью запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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