sql >> Base de Datos >  >> RDS >> Oracle

SQL que requiere autounión y clasificación

Si he entendido lo que quiere, puede hacerlo con funciones analíticas y cláusulas de ventanas .

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;

La selección interna calcula el número de partidos y el número total de goles en ellos, para cada equipo local/visitante en cada temporada, utilizando la versión analítica de count y sum , y la cláusula de ventana rows between ... limita ambos a los cinco anteriores, excluyendo la fila actual, que creo que es lo que desea. Luego, la selección externa agrega los totales relevantes para los dos equipos en la fila actual, pero verifica ambos conteos y deja el total nulo si alguno es <5. Tenga en cuenta que solo alcanza los matches mesa una vez.

Con un filtro adicional inmediatamente antes del pedido:

where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'

... obtienes:

    SEASON MATCHDATE HOMETEAM                  AWAYTEAM                   HOMEGOALS  AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
      2012 13-MAY-12 Norwich                   Aston Villa                        2          0         30

Podría usar esto para actualizar la tabla para la fila coincidente, aunque generalmente lo calcularía según sea necesario para evitar posibles errores de integridad de datos, posiblemente en una vista.