我正在研究一个试图想出你目前的出勤记录是什么的查询。换句话说,第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.我想为参加最后一场比赛的所有人做这件事。
答案 0 :(得分:3)
我们假设您的表格为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
既然每个人的事件都被分组为条纹(肯定是奇怪的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
注意:
答案 1 :(得分:0)
我认为会是:
SELECT unique_name, count(event_number)
FROM <table>
GROUP BY unique_name
ORDER BY count(event_number) Desc
除非我遗漏了某些东西
答案 2 :(得分:0)
试试这个:
SELECT UniqueName, COUNT(*) as AttendedEventCount
FROM tableName
GROUP BY UniqueName