3

假设有 25 组程序员,每组有 5-100 名程序员。每组程序员的任务是编写该问题所涉及的查询。为了响应这项任务,每个组中的许多程序员开始酗酒。每个组都有一个储备酒吧,包括:

  • 威士忌酒
  • 伏特加酒
  • 啤酒

每次程序员喝完一杯,都会在表中添加一个新行,包括:

  • 喝完酒的时间
  • 组 ID
  • 程序员 ID
  • 饮用的饮料类型

项目经理希望每六个小时收到一封电子邮件,其中列出了在过去 6 小时内连续喝了 5 杯或更多啤酒的程序员列表,而没有喝一杯伏特加/威士忌或一杯水。每个程序员至少喝过一次而没有换过另一种饮料的啤酒总数需要包含在报告中。

如果在达到 5 杯啤酒之前至少喝了一种啤酒以外的饮料,那么该程序员将不会出现在列表中。

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

对任何程序员可以饮用的饮料类型或顺序没有要求。

MySQL 数据库有一个表“drinks”,其中包含:

  • Drinks_id INT(11) PK NN AI
  • group_id INT(11) NN
  • 程序员 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' 计算两条记录之间存在的连续记录数,并返回每个组/程序员组合的最大值。我似乎无法做到正确,这可能不是首先看待这个问题的方式。

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

4

1 回答 1

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
于 2013-09-30T22:14:48.903 回答