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

Gặp sự cố khi kết hợp HAVING với WHERE trên một QUERY rất đơn giản

Tôi không có bất kỳ nền tảng PostgreSQL nào nhưng hãy xem điều này có hoạt động không:

Tôi sẽ bắt đầu điều này bằng cách đơn giản hóa nó, bằng cách viết một truy vấn mà trước tiên trả về tổng điểm của người chơi:

SELECT player_id, SUM(score) score
FROM (
  SELECT first_player as player_id, first_score as score
  FROM matches
  UNION ALL
  SELECT second_player, second_score
  FROM matches
)
GROUP BY player_id

Bây giờ, hãy nối tập dữ liệu đó với người chơi để tìm các nhóm:

SELECT w.player_id, p.group_id, w.score
FROM
(
  SELECT player_id, SUM(score) score
  FROM (
    SELECT first_player as player_id, first_score as score
    FROM matches
    UNION ALL
    SELECT second_player, second_score
    FROM matches
  )
  GROUP BY player_id
) as w
inner join players p
on p.player_id = w.player_id

Bây giờ chúng tôi có tất cả các cầu thủ, tổng điểm của họ và nhóm của họ. Chúng tôi muốn xác định người chiến thắng theo nhóm? Chúng tôi có thể sử dụng xếp hạng các chức năng để thực hiện việc này:

SELECT 
w.player_id, 
p.group_id, 
w.score, 
RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
FROM
(
  SELECT player_id, SUM(score) score
  FROM (
    SELECT first_player as player_id, first_score as score
    FROM matches
    UNION ALL
    SELECT second_player, second_score
    FROM matches
  )
  GROUP BY player_id
) as w
inner join players p
on p.player_id = w.player_id

Bây giờ chúng ta chỉ cần chọn những người hàng đầu trong mỗi nhóm (xếp hạng =1) bằng cách sử dụng WHERE

  SELECT 
  player_id, 
  group_id
  FROM
  (
      SELECT 
      w.player_id, 
      p.group_id, 
      w.score, 
      RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
      FROM
      (
        SELECT player_id, SUM(score) score
        FROM (
          SELECT first_player as player_id, first_score as score
          FROM matches
          UNION ALL
          SELECT second_player, second_score
          FROM matches
        )
        GROUP BY player_id
      ) as w
      inner join players p
      on p.player_id = w.player_id
    ) as gp
    WHERE group_placement = 1

Có vẻ phức tạp? có, nhưng bạn có thể thấy kết quả cuối cùng được cung cấp từng chút một. Mỗi bước này là một 'bảng con' và bạn có thể chạy và quan sát dữ liệu tại mỗi điểm.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách tốt để phân đoạn ngang trong postgresql là gì

  2. Chỉ mục trên Dấu thời gian:Các hàm trong biểu thức chỉ mục phải được đánh dấu là CÓ THỂ NGAY LẬP TỨC

  3. Làm thế nào để giải quyết vấn đề về quyền khi chạy Postgresql từ minikube?

  4. Chuyển đổi thời gian thành giây trong PostgreSQL

  5. chọn / hiển thị id sê-ri được chèn lần cuối trong postgres