假设有25个程序员组,每组中有5-100个程序员.每组程序员都有编写此问题所指查询的任务.为了响应此任务,每个小组中的许多程序员开始大量饮酒.每个组都有一个库存栏,其中包括:
>威士忌
>伏特加酒
>啤酒
>水
程序员每次喝完酒,都会在表中添加新行,其中包括:
>饮料冲完的时间
>组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<>在两个记录之间存在的连续记录数. “啤酒”并返回每个组/程序员组合的最大值.我似乎无法正确解决问题,而这也许并不是解决该问题的方法.
提前致谢.如果需要,我将很乐意提供任何其他信息或要求.
解决方法:
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
标签:gaps-and-islands,sql,mysql 来源: https://codeday.me/bug/20191122/2061796.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。