gpt4 book ai didi

mysql - 参加 Streak MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 02:04:11 26 4
gpt4 key购买 nike

我正在处理一个查询,试图找出您当前的连续出勤记录。所以换句话说,人 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

endstate 查询结果有望产生:

John - 3
Paul - 2
Steve - 1

这里额外有趣的部分是已经发生了数百个事件,还有数百人已经/没有参加过。我找到了几篇关于 mysql 查询当前连胜的文章,但如果对每个可能的人没有明确的是/否,我就不会。

关于如何构建它有什么想法吗?


各位 - 感谢您的快速回复!不过,让我稍微澄清一下……我并不是要计算每个人参加的事件总数。相反,对于参加最后一次事件的每个人的人口,他们至少有 1 的连胜。但是如果你参加了最后一次事件,并且你也参加了最后 5 场事件,你的连胜就是 5。情况就是这样即使你在过去 3 年里参加了 100 场事件,如果你错过了一个约会,然后出现了最后 5 次可能的约会,你的连胜是 5 次。我想为参加最后一次事件的每个人做这件事。

最佳答案

假设您的表是 Event,列是 EventIDName。我们可以通过以下查询确定每个人参加事件的顺序(即 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

现在每个人的事件都被分组为连续(公认的奇怪的 StreakGroup 数字!),我们可以确定每个人的连续的长度:

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 只想要当前的连胜(即,包括最新事件的连胜),但我将具体解决方案留给 OP 来解决,因为此处显示的通用解决方案将适用于更多程序员。<
  • 可以使用 View 而不是子查询来清理代码。
  • 我没有试过运行这段代码。可能有错误。

关于mysql - 参加 Streak MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9476016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com