計算一行中兩列或多列超過某個值的位置basketball,doubledouble,tripledouble_b一種s到和噸b一種一世一世,d○你b一世和d○你b一世和,噸r一世p一世和d○你b一世和basketball, double d…
我玩籃球遊戲,它允許將其統計數據輸出為數據庫文件,因此可以從中計算出遊戲中未實現的統計數據。到目前為止,我計算我想要的統計數據沒有問題,但現在我遇到了一個問題:根據他的比賽統計數據計算一個球員在本賽季取得的雙打和/或三雙的數量。
雙雙和三雙的定義如下:
雙雙:
兩雙被定義為球員在一場比賽中在五個統計類別中的兩個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。
三雙:
三雙被定義為球員在一場比賽中在五個統計類別中的三個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。
四雙(為澄清而添加)
四雙被定義為球員在一場比賽中在五個統計類別中的四個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。
“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
……現在你可能在讀完這篇文章後也在嘔吐(或大笑)。我什至沒有寫出獲得所有雙雙組合所需的所有內容,並且省略了三雙組合的 case 語句,因為它更加荒謬。
有一個更好的方法嗎?無論是使用我擁有的表結構還是使用新的表結構(我可以編寫一個腳本來轉換錶)。
我可以使用 MySQL 5.5 或 PostgreSQL 9.2。
這是 SqlFiddle 的連結,其中包含範例數據和我在上面發布的糟糕解決方案:http ://sqlfiddle.com/#!2/af6101/3
請注意,我對四雙(見上文)並不真正感興趣,因為據我所知,它們不會出現在我玩的遊戲中,但如果查詢很容易擴展而無需大量重寫,那將是一個加分項為四雙。
不知道這是否是最好的方法。我首先進行了選擇以找出統計數據是否為兩位數,如果是,則將其分配為 1。將所有這些加起來以找出每場比賽的兩位數總數。從那裡總結所有的雙打和三打。似乎工作
select a.player_id, a.team, sum(case when a.doubles = 2 then 1 else 0 end) as doubleDoubles, sum(case when a.doubles = 3 then 1 else 0 end) as tripleDoubles from (select *, (case when points > 9 then 1 else 0 end) + (case when rebounds > 9 then 1 else 0 end) + (case when assists > 9 then 1 else 0 end) + (case when steals > 9 then 1 else 0 end) + (case when blocks > 9 then 1 else 0 end) as Doubles from PlayerGameStats) a group by a.player_id, a.team