我想分析一些棒球統計數據,並且在實現看起來應該是一件簡單的任務時遇到了一些麻煩。看看下面的結果集:正在使用我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