Postgres Windows Слишком медленный запрос функции - PullRequest
0 голосов
/ 04 мая 2020

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

Он также имеет некумулятивный результат для этой строки: выиграл или проиграл

id  team  opp   year_id   game_dt   won    lost    games_played   games_won
---------------------------------------------------------
a   ANA   TEX   1980     19800527   1        0         41             17
b   ANA   TEX   1980     19800528   1        0         42             18
c   TEX   OAK   1080     19800525   1        0         40             21
d   TEX   ANA   1980     19800527   0        1         42             22

Цель состоит в том, чтобы получить самую последнюю запись противника (games_won / games_played), но не включая дату игры для текущего ряда. Я считаю, что логика c моего запроса работает, но это занимает так много времени, я знаю, что это не будет достаточно эффективно для ежедневных обновлений.

select team,opp,year_id,game_dt  from team_win_loss t1 where EXISTS (
select * from(select team,year_id,game_dt,games_won,games_played ,
ROW_NUMBER() OVER (Partition By year_id,team order by game_dt desc) row_number 
from team_win_loss t2 where game_dt<t1.game_dt and team=t1.opp and t1.year_id=year_id  
and cast(games_won as float)/cast(games_played as float)>=.500 ) as rows
where row_number=1 )
order by team,year_id,game_dt

Мой запрос также может получить только Если значение opp выше .500, в идеале мне бы хотелось, чтобы выводились новые столбцы для отображения записей против .500 и ниже .500 opps:

id  team  opp   year   game_dt   games_played   games_won  game_played_vs_winners   games_won_vs_winners   games_played_vs_losers   games_won_vs_losers

Единственное, о чем я мог подумать, это поставить подзапрос с функцией windows, получающий предыдущую дату. Я должен был прервать это, это заняло так много времени на моих данных.

Я не думаю, что «ГДЕ СУЩЕСТВУЕТ» тоже будет работать, поскольку мне, вероятно, понадобятся отдельные подзапросы для каждого столбца (если напротив самая последняя запись на сегодняшний день> =. 500 или <.500). </p>

...