【问题标题】:finding max value of finishes per date [closed]找到每个日期完成的最大值[关闭]
【发布时间】:2019-10-05 13:09:54
【问题描述】:

请原谅标题,但我完全不知道如何描述这个。

我有一张这样的桌子:

trackID playerID score   date
1        2       4510    1494075555
1        2       4507    1494076300
1        2       4513    1494076561
2        3       39455   1494083772
3        3       5665    1494089018
2        2       38444   1494074519
4        3       34443   1494089138
5        3       56443   1494260918

我只想要每首曲目的第一次完成,一个曲目可以有多个玩家在同一日期完成。 我想在一天内完成最多的第一次完成。

在上表中,玩家 3 在 2017 年 5 月 6 日首次完成了 3 张地图。 在 8.5.2017 上,他只完成了一首曲目。我只想包括他完成最多曲目的日期。

我想要的结果:

playerID trackID count(trackID)  date
3        2,3,4       3           6.5.2017
2        1,2         2           6.5.2017

【问题讨论】:

  • 修复示例数据中的日期。
  • 到目前为止你尝试过什么?你在哪里卡住了?什么是第一次完成?
  • 没有曲目整理细节。
  • 数据集的代表性不强。除一个之外的所有曲目共享相同(单独)日期

标签: mysql subquery


【解决方案1】:

这很丑陋,但我们能做什么。 增加样本量以测试有些复杂的算法并显示限制

所以为了更好地验证我的结果。

桌子

CREATE TABLE table1
    (`trackID` int, `playerID` int, `score` int, `date` int)
;

INSERT INTO table1
    (`trackID`, `playerID`, `score`, `date`)
VALUES
    (1, 2, 4510, 1494075555),
    (1, 2, 4507, 1494076300),
    (1, 2, 4513, 1494076561),
    (2, 3, 39455, 1494083772),
    (3, 3, 5665, 1494089018),
    (2, 2, 38444, 1494074519),
    (4, 3, 34443, 1494089138),
    (5, 3, 56443, 1494260918),
    (6, 3, 56443, 1494260928),
    (7, 3, 56443, 1494260938),
    (1, 4, 4510,1494324530),
    (2, 4, 4510,1494324530),
    (3, 4, 4510,1494324530),
    (4, 4, 4510,1494324530),
    (5, 4, 4510,1494324530),
    (6, 4, 4510,1494324530)
;

有了这个选择语句

SELECT
  a4.trackID, a4.playerID, 
  MAX(
  a4.countgroup
  ) countgroup,
  MAX(
  CONCAT(day_a,".",month_a,".",year_a)
  )  `date`
FROM
(
   SELECT 
     Group_COnCAT(DISTINCT trackID) trackID,
     playerID
     , Count(*) countgroup 
     ,YEAR(FROM_UNIXTIME(`date`)) year_a
     ,MONTH(FROM_UNIXTIME(`date`))  month_a
     ,DAY(FROM_UNIXTIME(`date`))  day_a
   FROM
    (Select 
       DISTINCT trackID, playerID,MAX(`date`) `date`
     FROM table1
    GROUP by  playerID,trackID
    ) c1
  GROUP BY playerID,YEAR(FROM_UNIXTIME(`date`)) 
         ,MONTH(FROM_UNIXTIME(`date`)) ,DAY(FROM_UNIXTIME(`date`))
 ) a4
inner join
( SELECT
   a2.playerID, a2.countgroup,a2.`date`
 FROM
 (
   SELECT playerID,  Count(*) countgroup, MAX(`date`) `date`
   FROM
    (
     Select 
       DISTINCT trackID, playerID,MAX(`date`) `date`
     FROM table1
     GROUP by  playerID,trackID
    ) c1
    GROUP BY playerID,YEAR(FROM_UNIXTIME(`date`)) 
         ,MONTH(FROM_UNIXTIME(`date`)) ,DAY(FROM_UNIXTIME(`date`))
  ) a2 
   INNER JOIN
  (
  SELECT playerID,max(countgroup) maxcountgroup, MAX( `date`)  `date`
   FROM
   (
     SELECT playerID,  Count(*) countgroup, MAX( `date`)  `date`
      FROM
      (
        Select 
          DISTINCT trackID, playerID,MAX(`date`) `date`
        FROM table1
        GROUP by  playerID,trackID
      ) c1
      GROUP BY playerID,YEAR(FROM_UNIXTIME(`date`)) 
         ,MONTH(FROM_UNIXTIME(`date`)) ,DAY(FROM_UNIXTIME(`date`))
    ) g1  
     GROUP BY playerID,YEAR(FROM_UNIXTIME(`date`)) 
         ,MONTH(FROM_UNIXTIME(`date`)) ,DAY(FROM_UNIXTIME(`date`))
  ) a3
  ON a2.playerID = a3.playerID AND a3.maxcountgroup = a2.countgroup
    and YEAR(FROM_UNIXTIME(a2.`date`))  = YEAR(FROM_UNIXTIME(a3.`date`)) 
     #and MONTH(FROM_UNIXTIME(a2.`date`)) = MONTH(FROM_UNIXTIME(a3.`date`))
     #and DAY(FROM_UNIXTIME(a2.`date`)) = DAY(FROM_UNIXTIME(a3.`date`))
) b4
ON a4.playerID = b4.playerID AND a4.countgroup = b4.countgroup
GROUP BY playerID,trackID;

你会得到以下结果

trackID         playerID    countgroup  date
1,2             2           2           6.5.2017
2,3,4           3           3           6.5.2017
5,6,7           3           3           8.5.2017
1,2,3,4,5,6     4           6           9.5.2017

这很复杂: 所以在表 a4 中我得到了所需的数据,但是每个玩家都有多天,我必须选择赢得最多曲目的日子。

进入表 b4,它为每个玩家选择到达的日期和最多的曲目。

您在示例中看到的问题是,当有两天或更多天征服了相同数量的轨道时。

这是 dbfiddle 示例,以便您对其进行测试 https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=88bb4f9c208ccf6a9865b79b1681faa5

edit2:必须在 SEELCT 和 b4 的 on 子句中添加日期列

【讨论】:

  • 您好,谢谢您的回复。你几乎得到了我想要的,所以我希望你能得到我想要的:在我的例子中,playerID 3 在 06.05.2017 完成了 3 个轨道,在 08.05.2017 完成了 1 个轨道,而不是显示08.05.2017 的计数为 4,就像您的结果一样,我只想要 06.05.2017 的 3 个完成的曲目,因为我只需要每天完成的最多曲目。我什至不确定这样的查询是否可行,因此我问了这个问题。感谢您的努力,不胜感激。
  • O,现在我明白了为什么会有三首曲目,但我如何确定哪首曲目完成了。因为玩家 2 到达轨道 2 但未到达轨道 3,玩家 3 到达轨道 5 但未到达轨道 6。那么为什么玩家 2 完成轨道 2 但付款人 3 未到达轨道 5
  • 基本上,如果一首曲目完成,它会收到一个分数。例如。播放器 2 完成第 1 轨,它会得到它发生时的分数和日期(unixtime)。如果玩家 2 再次完成曲目 1,它将再次获得分数和日期。因此,为什么玩家 2 在轨道 1 上有多个分数。我只希望每个玩家每个轨道一次,与最早的日期相关联。玩家 2 可能还没有完成 trackID 3,但可以在以后完成。我希望清除的东西,这很难解释。尽管如此,还是感谢您的努力。
  • 这并不能解释为什么付款人 3 还没有完成第 5 轮。在您的表格中,最后一个条目是 (5,** 3**, 56443, 1494260918) 所以这意味着根据您的解释 玩家 3 以 56443 的分数完成了第 5 轮,并且在 5 月 8 日
  • 确实,玩家 3 在 5 月 8 日完成了第 5 轨。但他在 5 月 6 日完成了第 2、3、4 首曲目,所以我只想保留他完成最多曲目的日期,在本例中为 5 月 6 日。
猜你喜欢
  • 2020-02-07
  • 2021-06-01
  • 2018-11-23
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多