我想分析一些棒球统计数据,并且在实现看起来应该是一件简单的任务时遇到了一些麻烦。看看下面的结果集:正在使用我ROW_NUMBER()OVER(ORDER BY GAME_PK,REC_SEQ)产生计算SQL中的棒球统计数据
GAME_PK REC_SEQ BatterId PlayNumber EventType
287576 6 462101 1 single
287576 14 519048 2 single
287576 25 435079 3 strikeout
287576 26 435079 4 stolen_base_home
287576 28 435079 5 stolen_base_2b
的PlayNumber列。其余部分直接来自MLB统计数据库。 REC_SEQ是游戏中事件的序列号。 EventType实质上是一个at-bat的结果。
我希望PlayNumber仅在BatterId更改时增加。但它必须尊重REC_SEQ的顺序。所以我不认为我可以使用RANK或DENSE_RANK,但这些似乎非常接近我所需要的。
我想我的结果集看起来像这样:
GAME_PK REC_SEQ BatterId PlayNumber EventType
287576 6 462101 1 single
287576 14 519048 2 single
287576 25 435079 3 strikeout
287576 26 435079 3 stolen_base_home
287576 28 435079 3 stolen_base_2b
任何帮助表示赞赏。
谢谢!编辑:在游戏中,击球手可能会出现超过一次。每次出现他都应该分配一个新的PlayNumber。基本上,每个新的at-bat都需要一个新的PlayNumber。
因为我没有你的源数据,我假装你张贴的样本是源数据。您应该能够将这个概念适用于您自己的数据源。我在这里还假定'BatterId'值不是交错的,即所有相同的BatterId值在'REC_SEQ'排序中一起出现。如果情况并非如此,那么这种情况就没有定义,即它们是否应该采用相同的PlayNumber值,或者获得指定的新值? – mellamokb 2012-04-20 17:18:34
BatterId值是交错的。所以同样的击球手可以在比赛后期出现,并且在那时应该被分配一个新的PlayNumber。我基本上希望每次击球手都能分配一个数字。 – 2012-04-20 17:33:39
这已经成倍地变得更加困难,但我认为我有它:http://www.sqlfiddle.com/#!3/a5e68/50 :)基本上必须找出组的开始和结束位置,方法是将每条记录与下面的记录来看看它是否是相同的batterid。然后,一旦我们确定了这些组,就可以通过查找相应的识别该特定组结束的“REC_SEQ”来确定每个记录属于哪个组。 – mellamokb 2012-04-20 17:51:44