Я пытаюсь понять, как команды справляются с другими командами, у которых рекорд больше, чем .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>