Mysql

計算一行中兩列或多列超過某個值的位置basketball,doubledouble,tripledouble_b一種s到和噸b一種一世一世,d○你b一世和d○你b一世和,噸r一世p一世和d○你b一世和basketball, double d…

  • December 24, 2016

我玩籃球遊戲,它允許將其統計數據輸出為數據庫文件,因此可以從中計算出遊戲中未實現的統計數據。到目前為止,我計算我想要的統計數據沒有問題,但現在我遇到了一個問題:根據他的比賽統計數據計算一個球員在本賽季取得的雙打和/或三雙的數量。

雙雙和三雙的定義如下:

雙雙:

兩雙被定義為球員在一場比賽中在五個統計類別中的兩個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。

三雙:

三雙被定義為球員在一場比賽中在五個統計類別中的三個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。

四雙(為澄清而添加)

四雙被定義為球員在一場比賽中在五個統計類別中的四個(得分、籃板、助攻、搶斷和蓋帽)中累計達到兩位數的表現。

“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

引用自:https://dba.stackexchange.com/questions/66553