Я граю в баскетбольну гру, яка дозволяє виводити її статистику у вигляді файлу бази даних, тому можна обчислити з неї статистику, яка не реалізована в грі. Поки я не мав жодних проблем з підрахунком потрібних статистичних даних, але тепер у мене виникли проблеми: підрахунок кількості подвійних парних та / або потрійних парних гравців, зроблених за сезон, зі своєї статистики гри.
Визначення подвійного подвійного і потрійного подвійного таке:
Двомісний-подвійний:
Двомісний подвійний визначається як вистава, при якій гравець накопичує двоцифрове число у двох з п'яти статистичних категорій - очок, рикошетів, передач, крадіжок та заблокованих пострілів - у грі.
Тримісний:
Потрійний дубль визначається як вистава, при якій гравець накопичує двоцифрове число в трьох з п’яти статистичних категорій - очок, рикошетів, передач, крадіжок та заблокованих пострілів - у грі.
Чотирьох- та подвійний (додано для уточнення)
Чотирикратний дубль визначається як вистава, при якій гравець накопичує двоцифрове число у чотирьох із п’яти статистичних категорій - очок, рикошетів, передач, крадіжок та заблокованих пострілів - у грі.
У таблиці "PlayerGameStats" зберігається статистика щодо кожної гри, яку грає гравець, і виглядає так:
CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES
( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ),
( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ),
( 3, 1, 6, 'Nuggets', 'Trailblazers', 11, 11, 1, 2, 1 ),
( 4, 1, 10, 'Nuggets', 'Mavericks', 8, 10, 2, 2, 12 ),
( 5, 1, 11, 'Nuggets', 'Knicks', 23, 12, 1, 0, 0 ),
( 6, 1, 12, 'Nuggets', 'Jazz', 8, 8, 11, 1, 0 ),
( 7, 1, 13, 'Nuggets', 'Suns', 7, 11, 2, 2, 1 ),
( 8, 1, 14, 'Nuggets', 'Kings', 10, 15, 0, 3, 1 ),
( 9, 1, 15, 'Nuggets', 'Kings', 9, 7, 5, 0, 4 ),
(10, 1, 17, 'Nuggets', 'Thunder', 13, 10, 10, 1, 0 )
) AS t(id,player_id,seasonday,team,opponent,points,rebounds,assists,steals,blocks);
Результат, який я хочу досягти, виглядає так:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
Єдине рішення, яке я знайшов поки що таке жахливе, що змушує мене нудити ...; o) ... Це виглядає приблизно так:
SELECT
player_id,
team,
SUM(CASE WHEN(points >= 10 AND rebounds >= 10) OR
(points >= 10 AND assists >= 10) OR
(points >= 10 AND steals >= 10)
THEN 1
ELSE 0
END) AS doubleDoubles
FROM PlayerGameStats
GROUP BY player_id
... і тепер ви, мабуть, теж пукаєте (або сильно смієтеся), прочитавши це. Я навіть не виписав усе, що було б потрібно для отримання подвійних подвійних комбінацій, і опустив випадок справи для потрійних пар, тому що це ще смішніше.
Чи є кращий спосіб зробити це? Або зі структурою таблиці у мене, або з новою структурою таблиці (я міг би написати сценарій для перетворення таблиці).
Я можу використовувати MySQL 5.5 або PostgreSQL 9.2.
Ось посилання на SqlFiddle з прикладними даними та моїм жахливим рішенням, яке я розмістив вище: http://sqlfiddle.com/#!2/af6101/3
Зауважте, що мене не дуже цікавлять чотиримісні парні (див. Вище), оскільки вони не зустрічаються в грі, в яку я граю, наскільки я знаю, але це буде плюсом, якщо запит легко розширюється без особливих перезаписів на рахунок для чотиризначних пар.