Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参与Streak MySQL查询_Mysql - Fatal编程技术网

参与Streak MySQL查询

参与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

我正在做一个查询,试图找出你目前的出勤记录。换句话说,第一个人参加了最后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
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来解决,因为这里显示的通用解决方案将适用于更多的程序员
  • 可以使用视图而不是子查询来清理代码
  • 我还没有试过运行这个代码。可能会有错误

如果没有确定的是非,您是否假设为“否”?(如果是的话,我想你会有某种外部连接,使用coalesce()或isnull()不使用NULL,或者你根本不在乎。只是关于“streak”的一个问题-所以如果我按名称排序,我会寻找连续事件数的最长运行时间?即一行中的最大事件数(由事件数决定)每人?(或者,如果史蒂夫参加了第34场比赛,而不是第33场或第35场,他的连胜成绩仍然是1,因为他最多连续参加了1场?)实际上,有一种很好的方法可以使用自连接来计算用户参加的事件数量,这些事件的EventID不高于当前行的EventID。如果我有时间,我会将其写在答案中。@MakeMinePanacea-是的,有一个明确的“否”如果他们没有列在表中;只有参加过的人的记录。@mathematic.coffee-我不需要最长的跑步记录,只需要每个人最新的跑步记录。如果没有确定的是非,您是否假设“否”?(如果是,我想您将使用某种外部连接并使用coalesce()或isnull()如果不使用空值,或者你根本不在乎。只是一个关于“streak”的问题-因此,如果我按名称排序,我将查找连续事件数的最长运行时间?即每人一行中的最大事件数(由事件数决定)?(或者,如果史蒂夫参加了第34场比赛,而不是第33场或第35场,他的连胜纪录仍然是1,因为他最多连续参加了1场比赛?)实际上,有一种很好的方法可以使用自连接来计算用户参加的事件数量,这些事件的EventID不高于当前行的EventID。如果我有时间,我会将其写在答案中。@MakeMinePanacea-是的,有一个明确的“否”如果他们没有在表中列出;只有参加过。@mathematic.coffee的人的记录-我不需要最长的跑步记录,只需要每个人最新的连胜记录。让你的跑步方式冷静下来。这是一个改编的。让你的跑步方式冷静下来。这是一个改编的。