2013-09-30 47 views
3

假設有25組程序員,每組有5-100位程序員。每個程序員組的任務是編寫這個問題涉及的查詢。爲了響應這一任務,每個組中的許多程序員開始大量飲酒。每個組都有由一個儲備充足的酒吧:獲取mysql中連續重複記錄的最大數量

  • 威士忌
  • 伏特加
  • 啤酒

每次程序員完成一個飲料,一個新行添加到表包括:

  • 飲料完成時間
  • 組ID
  • 程序員ID
  • 飲料的類型消耗

項目經理希望每六小時通過電子郵件發送與誰已連續食用5種以上啤酒的程序員的清單,內過去的6個小時,沒有一杯伏特加酒或威士忌,或一杯水。報告中必須包括每個程序員至少在不換用其他飲料的情況下消耗的啤酒總數。

如果在啤酒達到5種啤酒之前至少喝了一杯啤酒以外的啤酒,那麼該程序員將不會進入清單。

程序員在6小時內可以飲用的飲料數量沒有上限或下限。

對於任何程序員都可以使用的飲料的類型或順序沒有要求。

MySQL數據庫具有表 '飲料' 與:

  • drinks_id INT(11)PK NN AI
  • GROUP_ID INT(11)NN
  • programmer_id INT(11)NN
  • type_of_drink VARCHAR(25)NN
  • time_finished DATETIME NN

(型飲料應該可能在另一張桌子上,並使用drink_type_id,但我要在這裏簡單說明)

我正在尋找的核心是連續行數的最大計數值,其中type_of_drink ='beer '在指定的時間段內爲每個組/程序員組合。我已經耗盡了我的sql技能,試圖計算兩條記錄之間存在的連續記錄的數量,這些記錄使用type_of_drink <>'beer'並返回每個組/程序員組合的最大值。我似乎無法做到,這可能不是首先看到這個問題的方法。

在此先感謝。如果需要,我很樂意提供任何其他信息或要求。

+0

您是否嘗試過窗口功能?您可以按程序員和飲料分組,然後返回一個計數(*)並將設置混淆以在每次點擊新飲料時重新開始計數。看看http://technet.microsoft.com/en-us/library/ms189461.aspx,這些文檔非常詳細,但希望您指出正確的方向。如果您需要更多幫助,請嘗試將示例數據放入sql小提琴併爲我們提供預期的輸出。 – Vulcronos

+0

@Vulcronos MySql沒有內置的這些函數... [但它們可以通過使用用戶變量來模擬](http://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-落後/)。 –

+0

@MichaelFredrickson感謝您的信息。我發現窗口功能非常有用,所以我會討厭使用沒有它們的平臺。我知道你也可以使用group by來獲取聚合值,然後返回到原始表來獲取你需要的數據。 – Vulcronos

回答

3
SELECT DISTINCT programmer_id 
FROM (
    SELECT 
    programmer_id, 
    @beercounter := IF(@prev_programmer != programmer_id OR type_of_drink != 'beer', 1, @beercounter + 1) AS how_many_beer_in_a_row, 
    @prev_programmer := programmer_id 
    FROM 
    your_table y 
    , (SELECT @beercounter:=1, @prev_programmer:=NULL) vars 
    WHERE time_finished >= NOW() - INTERVAL 6 HOUR 
    ORDER BY programmer_id, time_finished 
) sq 
WHERE how_many_beer_in_a_row >= 5 
+0

這是訣竅。必須稍微修改它才能處理實際數據,但情況總是如此。非常感謝! – user2832688