参与Streak MySQL查询
我正在做一个查询,试图找出你目前的出勤记录。换句话说,第一个人参加了最后5个活动,第二个人参加了最后6个活动,等等。我得到的数据文件非常简单:参与Streak MySQL查询,mysql,Mysql,我正在做一个查询,试图找出你目前的出勤记录。换句话说,第一个人参加了最后5个活动,第二个人参加了最后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 St
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查询CurrentStreak的文章,但如果没有对每个可能的人给出明确的是/否,就不会有
关于如何建造这座大楼有什么想法吗
各位,谢谢你们的快速回复!不过,让我澄清一点……我并不是想得到每个人参加活动的总数。相反,对于参加上一次活动的所有人来说,他们至少有1%的连续性。但是如果你参加了最后一个活动,并且你也参加了最后5个活动,你的连胜纪录将是5。即使你在过去3年里参加了100次活动,如果你错过了一次约会,然后在最后5次可能的约会中出现,你的连胜纪录也是5次。我想为参加上次活动的每个人做这件事。我想应该是:
SELECT unique_name, count(event_number)
FROM <table>
GROUP BY unique_name
ORDER BY count(event_number) Desc
选择唯一的\u名称、计数(事件\u编号)
从…起
按唯一名称分组
按计数排序(事件编号)说明
除非我遗漏了什么,否则我想应该是:
SELECT unique_name, count(event_number)
FROM <table>
GROUP BY unique_name
ORDER BY count(event_number) Desc
选择唯一的\u名称、计数(事件\u编号)
从…起
按唯一名称分组
按计数排序(事件编号)说明
除非我遗漏了什么试试这个:
SELECT UniqueName, COUNT(*) as AttendedEventCount
FROM tableName
GROUP BY UniqueName
试试这个:
SELECT UniqueName, COUNT(*) as AttendedEventCount
FROM tableName
GROUP BY UniqueName
假设您的表是
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只需要当前的条纹(即,包含最新事件的条纹),但我将把具体的解决方案留给OP来解决,因为这里显示的通用解决方案将适用于更多的程序员
- 可以使用视图而不是子查询来清理代码
- 我还没有试过运行这个代码。可能会有错误
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只需要当前的条纹(即,包含最新事件的条纹),但我将把具体的解决方案留给OP来解决,因为这里显示的通用解决方案将适用于更多的程序员
- 可以使用视图而不是子查询来清理代码
- 我还没有试过运行这个代码。可能会有错误