Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL membutuhkan self join dan ranking

Jika saya mengerti apa yang Anda inginkan, Anda dapat melakukannya dengan fungsi analitik dan klausa windowing .

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;

Pilihan dalam menghitung jumlah pertandingan dan jumlah total gol di antara mereka, untuk setiap tim kandang/tandang di setiap musim, menggunakan versi analitik count dan sum , dan klausa jendela rows between ... membatasi keduanya ke lima sebelumnya, tidak termasuk baris saat ini, yang menurut saya adalah yang Anda inginkan. Pilihan luar kemudian menambahkan total yang relevan bersama-sama untuk kedua tim di baris saat ini, tetapi memeriksa keduanya dihitung dan meninggalkan total nol jika keduanya <5. Perhatikan bahwa itu hanya mengenai matches meja sekali.

Dengan filter tambahan tepat sebelum order-by:

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

... Anda mendapatkan:

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

Anda dapat menggunakan ini untuk memperbarui tabel untuk baris yang cocok, meskipun umumnya saya akan menghitungnya sesuai kebutuhan untuk menghindari potensi kesalahan integritas data, mungkin dalam tampilan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan nilai untuk tanggal berikutnya dan berikutnya dalam sebuah tabel

  2. Cara Menghitung Perbedaan Antara Dua Timestamp di Oracle

  3. untuk apa oci_bind_by_name?

  4. Perlu Oracle SQL untuk membagi rentang tanggal/waktu berdasarkan hari

  5. Oracle LIMIT dan batasan 1000 kolom