PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Има проблеми с комбинирането на HAVING с WHERE при много проста QUERY

Нямам опит в PostgreSQL, но да видим дали това работи:

Бих започнал това, като го опростя, като напиша заявка, която първо връща общия резултат по играч:

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

Сега присъединете този набор от данни към играчите, за да намерите групите:

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

Сега имаме всички играчи, техния общ резултат и тяхната група. Искаме ли да определим победителя по групи? Можем да използваме класиране функции за това:

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

Сега просто избираме най-добрите във всяка група (ранг =1) с помощта на 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

Изглежда сложно? да, но можете да видите, че крайният резултат се предоставя малко по малко. Всяка стъпка от това е „подтаблица“ и можете да изпълнявате и наблюдавате данните във всяка точка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Схема на релационна база данни за източник на събития

  2. PostgreSQL regexp_replace със съответстващ израз

  3. Вземете броя на дните в месеца в PostgreSQL

  4. PLV8 поддържа ли извършване на http повиквания към други сървъри?

  5. Как да промените max_connections за Postgres чрез SQL команда