PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengalami masalah dalam menggabungkan HAVING dengan WHERE pada QUERY yang sangat sederhana

Saya tidak memiliki latar belakang PostgreSQL tetapi mari kita lihat apakah ini berfungsi:

Saya akan memulai ini dengan menyederhanakannya, dengan menulis kueri yang terlebih dahulu mengembalikan skor total menurut pemain:

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

Sekarang, gabungkan kumpulan data itu ke pemain untuk menemukan grup:

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

Sekarang kami memiliki semua pemain, skor total dan grup mereka. Kami ingin mengidentifikasi pemenang berdasarkan kelompok? Kita dapat menggunakan peringkat berfungsi untuk melakukan ini:

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

Sekarang kita tinggal memilih yang teratas di setiap grup (peringkat =1) menggunakan 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

Terlihat rumit? ya, tetapi Anda dapat melihat hasil akhir disediakan sedikit demi sedikit. Setiap langkah ini adalah 'subtabel' dan Anda dapat menjalankan dan mengamati data di setiap titik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Intel SSD, sekarang keluar dari daftar sh..err, malu

  2. Cara bersih untuk menggunakan fungsi jendela postgresql di Django ORM?

  3. Bagaimana cara MEMBERIKAN SEMUA HAK ISTIMEWA pada SEMUA VIEWS dalam satu pernyataan?

  4. Bagaimana cara membandingkan tanggal di bidang datetime di Postgresql?

  5. lastInsertId tidak berfungsi di Postgresql