Применить ограничение на оператор CASE - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь собрать количество разных столбцов для игроков (вам не нужно знать входы и выходы всех столбцов). У нас есть столбцы player_1 и player_2, поэтому я выделил их, чтобы получить общее количество, как вы можете видеть ниже:

SELECT player, 
                COUNT(*) AS since_start_matches, 
                COUNT(CASE WHEN ht_total_goals=0 THEN 1 END) AS since_start_ht_0,
                
                COUNT(CASE WHEN la_date BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() THEN 1 END) AS last_14_d_matches,
                COUNT(CASE WHEN ht_total_goals=0 AND la_date BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() THEN 1 END) AS last_14d_ht_0,
               
FROM ((SELECT player_1 as player, la_date, ht_total_goals
       FROM results ORDER BY la_date DESC, session_start DESC
      ) UNION ALL
      (SELECT player_2 as player, la_date, ht_total_goals
       FROM results ORDER BY la_date DESC, session_start DESC
      )
     ) p
GROUP BY player

Я также хочу получить частоту голов в последних 32 играх для этих игроков как ну .. Нет способа добавить предложение LIMIT в CASE WHEN, когда я предполагаю?

Например, я хочу добавить столбец:

COUNT(CASE WHEN ht_total_goals=0 THEN 1 END LIMIT 32 ) AS last_32_games_ht_0

Это выиграло ' t работает, я предполагаю, потому что таблица, из которой мы выбираем, содержит все строки, а оператор CASE WHEN не позволяет применять ограничения?

Я мог бы сделать это в отдельном запросе, но в идеале я хочу все в одном.

Помощь приветствуется.

1 Ответ

1 голос
/ 10 июля 2020

Я также хочу получить частоту голов в последних 32 играх для этих игроков.

Вам понадобится дополнительный подзапрос, а затем условное агрегирование:

SELECT . . . ,
       COUNT(*) AS since_start_matches, 
       SUM( ht_total_goals = 0 ) AS since_start_ht_0,
            
       SUM( la_date BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() ) AS last_14_d_matches,
       SUM( ht_total_goals = 0 AND la_date BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() ) AS last_14d_ht_0,
       SUM( (seqnum <= 32) AND (ht_total_goals = 0) ) 
FROM (SELECT p.*, ROW_NUMBER() OVER (PARTITION BY player ORDER BY la_date DESC) as seqnum
      FROM ((SELECT player_1 as player, la_date, ht_total_goals
             FROM results
            ) UNION ALL
            (SELECT player_2 as player, la_date, ht_total_goals
             FROM results
            )
           ) p
     ) p
GROUP BY player;

Примечания:

  • ORDER BY в подзапросе производной таблицы действительно не работает. Это лишнее, поэтому я удалил его.
  • Вы можете упростить свои COUNT() столбцы, просто добавив логическое значение. Это очень удобное расширение MySQL.
...