Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

SQL yêu cầu tự tham gia và xếp hạng

Nếu tôi hiểu bạn muốn gì, bạn có thể thực hiện việc này với hàm phân tích điều khoản cửa sổ .

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;

Lựa chọn bên trong tính toán số trận đấu và tổng số bàn thắng trên các trận đấu đó, cho từng đội nhà / đội khách trong mỗi mùa giải, bằng cách sử dụng phiên bản phân tích của countsum và mệnh đề cửa sổ rows between ... giới hạn cả năm hàng trước, không bao gồm hàng hiện tại, mà tôi nghĩ đó là những gì bạn muốn. Lựa chọn ngoài cùng sau đó sẽ cộng các tổng có liên quan cho hai đội trong hàng hiện tại, nhưng kiểm tra cả hai số và để lại tổng số rỗng nếu một trong hai là <5. Lưu ý rằng nó chỉ đánh vào các trận đấu matches bảng một lần.

Với một bộ lọc bổ sung ngay trước đơn đặt hàng:

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

... bạn nhận được:

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

Bạn có thể sử dụng điều này để cập nhật bảng cho hàng phù hợp, mặc dù nói chung tôi sẽ tính toán nó khi cần thiết để tránh các lỗi tiềm ẩn về tính toàn vẹn của dữ liệu, có thể trong một chế độ xem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính tổng các cột có giá trị null trong oracle

  2. Oracle lấy ngày được định dạng dưới dạng chuỗi giữa hai ngày

  3. Sự cố khi người dùng nhập dữ liệu trong lệnh sql

  4. Hỗ trợ Spring JDBC và tập dữ liệu lớn

  5. Truy vấn động cho PIVOT trong mệnh đề