PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Função no PostgreSQL para inserir de uma tabela para outra?


Você pode resolver esse problema em SQL puro, não precisa de uma função para isso.

O melhor é dividir a coleta de estatísticas em duas consultas distintas, uma para quando o time joga em casa e outra quando joga fora. Para cada jogo calcule os pontos e os gols marcados. Então UNION essas duas consultas e use isso como uma subconsulta para calcular as estatísticas gerais:
SELECT
  eq.nom_equipo AS equipo,
  COUNT(p.*) AS partidos_jug,
  SUM(CASE WHEN p.puntos = 3 THEN 1 ELSE 0 END) partidos_gana,
  SUM(CASE WHEN p.puntos = 1 THEN 1 ELSE 0 END) partidos_emp,
  SUM(CASE WHEN p.puntos = 0 THEN 1 ELSE 0 END) partidos_perd,
  SUM(p.puntos) AS puntos,
  SUM(p.goles) AS goles_favor
FROM equipos eq
JOIN (
  -- Playing at home
  SELECT
    num_eqpo_loc AS eqpo, 
    CASE WHEN (goles_loc > goles_vis) THEN 3
         WHEN (goles_loc = goles_vis) THEN 1
         ELSE 0
    END AS puntos,
    goles_loc AS goles
  FROM partidos
  UNION
  -- Playing away
  SELECT
    num_eqpo_vis AS eqpo, 
    CASE WHEN (goles_vis > goles_loc) THEN 3
         WHEN (goles_vis = goles_loc) THEN 1
         ELSE 0
    END AS puntos,
    goles_vis AS goles
  FROM partidos) AS p ON p.eqpo = eq.num_eqpo
GROUP BY equipo
ORDER BY puntos DESC, partidos_jug ASC, goles_favor DESC;

Isso não é particularmente rápido devido ao CASE instruções, mas será mais rápido do que usar um procedimento e um loop.

Em vez de colocar o resultado desta consulta em uma tabela, sugiro que você CREATE VIEW general AS ... com a consulta acima. Nesse caso, você sempre obtém os resultados mais recentes quando SELECT * FROM general e você não precisa TRUNCATE a tabela geral antes de executar a consulta (adicionar novos resultados com dados na tabela violará a restrição PK). Se você realmente precisa da tabela, use SELECT ... INTO general FROM ... na consulta acima.