我正在做一个查询,试图找出你目前的出勤记录。换言之,第1个人参加了最后5个活动,第2个人参加了最后6个活动,等等。我得到的数据文件非常简单:
Event Number - Unique Name
34 - Tim
34 - John
34 - Mike
34 - Larry
35 - John
35 - Mike
35 - Larry
35 - Paul
36 - John
36 - Steve
36 - Paul
最终状态查询结果有望产生:
John - 3
Paul - 2
Steve - 1
另一个有趣的地方是,已经发生了几百件事,还有几百人没有参加。我已经为当前streak找到了几篇关于mysql查询的文章,但如果没有针对每个可能的人的明确的yes/no的话,就不会了。
你有没有想过怎么建这个?
各位-谢谢你们的快速反应!不过,让我澄清一下……我并不是想得到每个人参加的活动总数。相反,对于参加上一次活动的所有人来说,他们至少有1人参加。但如果你参加了最后一个活动,而且你也参加了最后5个活动,你的连胜纪录将是5。即使你在过去的3年里参加了100个活动,如果你错过了一个约会,然后出现在最后5个可能的日期,你的连续记录是5。我想为所有参加上次活动的人做这件事。
最佳答案
假设您的表是Event
,列是EventID
和Name
。我们可以通过以下查询确定每个人参加活动的顺序(即1、2、3等):
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
我们可以利用
PersonalEventSequence
将每个人的事件分组为连续事件:SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
现在,每个人的事件都被分成了条带(有公认的奇怪的条带组号!),我们可以确定每个人的条纹长度:
SELECT
Name, StreakGroup, COUNT(*) AS StreakLength
FROM
(
SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
) SubQuery2
GROUP BY
Name, StreakGroup
现在我们知道了每个人的条纹长度,我们可以确定每个人最长条纹的长度:
SELECT
Name, MAX(StreakLength) AS PersonalRecordStreakLength
FROM
(
SELECT
Name, StreakGroup, COUNT(*) AS StreakLength
FROM
(
SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
) SubQuery2
GROUP BY
Name, StreakGroup
) SubQuery3
GROUP BY
Name
笔记:
OP只想要当前的streaks(即包含最新事件的streaks),但是我将把具体的解决方案留给OP来解决,因为这里显示的通用解决方案将适用于更多的程序员。
可以使用视图而不是子查询来清理代码。
我没有试过运行这个代码。可能有错误。
关于mysql - 参加连胜MySQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9476016/