Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL exigindo auto-junção e classificação


Se eu entendi o que você quer, você pode fazer isso com funções analíticas e cláusulas de janela .
select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
    case when home_cnt >= 5 and away_cnt >= 5 then
        home_tot + away_tot
    else null end as totalgoals
from (
    select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
        count(*) over (partition by season, hometeam
            order by matchdate
            rows between 5 preceding and 1 preceding) as home_cnt,
        sum(homegoals + awaygoals) over (partition by season, hometeam
            order by matchdate
            rows between 5 preceding and 1 preceding) as home_tot,
        count(*) over (partition by season, awayteam
            order by matchdate
            rows between 5 preceding and 1 preceding) as away_cnt,
        sum(homegoals + awaygoals) over (partition by season, awayteam
            order by matchdate
            rows between 5 preceding and 1 preceding) as away_tot
    from matches
)
order by season, matchdate, hometeam, awayteam;

A seleção interna calcula o número de partidas e o número total de gols entre elas, para cada time da casa/fora em cada temporada, usando a versão analítica de count e sum , e a cláusula de janela rows between ... limita ambos aos cinco anteriores, excluindo a linha atual, que acho que é o que você deseja. A seleção externa adiciona os totais relevantes juntos para as duas equipes na linha atual, mas verifica ambas as contagens e deixa o total nulo se um deles for <5. Observe que ele atinge apenas os matches mesa uma vez.

Com um filtro adicional imediatamente antes do pedido:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'

... você recebe:
    SEASON MATCHDATE HOMETEAM                  AWAYTEAM                   HOMEGOALS  AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
      2012 13-MAY-12 Norwich                   Aston Villa                        2          0         30

Você pode usar isso para atualizar a tabela para a linha correspondente, embora geralmente eu calcule conforme necessário para evitar possíveis erros de integridade de dados, possivelmente em uma exibição.