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
请注意,我对四重双打并不太感兴趣(参见上文),因为据我所知,在我玩的游戏中并不存在这种情况,但如果查询能够轻松扩展而无需进行太多重写以适应四重双打,那将是一个加分项。
CASE语句,因为布尔表达式在为真时会评估为1,为假时会评估为0。我已经将它添加到了我的答案中,并向你致以感谢,因为在这里无法在评论中发布完整的SQL代码块。 - Joshua HuberCASE和SUM/COUNT可以让它在Postgres中也能工作。 - ypercubeᵀᴹCASE通常会稍微快一点。我添加了一个演示,还有一些其他小的改进。 - Erwin Brandstetter