获取mysql中连续重复记录的最大数量

时间:2013-09-30 21:41:20

标签: mysql sql gaps-and-islands

假设有25组程序员,每组有5-100名程序员。每组程序员的任务是编写此问题所引用的查询。为了应对这一任务,每个小组中的许多程序员开始大量饮酒。每个组都有一个库存条,包括:

  • 威士忌
  • 伏特加
  • 啤酒

每当程序员喝完酒,就会在表格中添加一个新行,包括:

  • 饮料完成的时间
  • 组ID
  • 程序员ID
  • 饮用的饮品类型

项目经理希望每六个小时通过电子邮件发送一份程序员名单,这些程序员在过去的6小时内连续消耗了5个或更多的啤酒,没有伏特加/威士忌或一杯水。每个程序员在不转换为另一种饮料的情况下消费的啤酒总数至少需要包含在报告中。

如果在到达5瓶啤酒之前至少饮用了一种啤酒以外的饮料,那么该程序员将不会列入清单。

程序员在6小时内可以饮用的饮品数量没有上限或下限。

对程序员可以消费的饮品类型或顺序没有要求。

MySQL数据库有一个'drink'表:

  • 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'并返回每个组/程序员组合的最大值。我似乎无法做到正确,这可能不是首先考虑这个问题的方法。

提前致谢。如果需要,我很乐意提供任何其他信息或要求。

1 个答案:

答案 0 :(得分: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