【问题标题】:MYSQL - SUM values of last 10 daysMYSQL - 过去 10 天的 SUM 值
【发布时间】:2017-07-02 21:04:00
【问题描述】:

我在mysql中有这个表:

|   player1   |  player2 |    date    |   fs_1   |   fs_2   |
    Jack         Tom       2015-03-02       10         2
    Mark        Riddley    2015-05-02       3          1 
     ...

我需要知道在 date_g 中报告的比赛之前(例如 10 天前),玩家 1 完成了多少 ace (fs_1)。

这是我尝试但没有成功的方法:

选项 1

    SELECT 
    players_atp.name_p AS 'PLAYER 1',
    P.name_p AS 'PLAYER 2',
    DATE(date_g) AS 'DATE',
    result_g AS 'RESULT',
    FS_1,
    FS_2,
    SUM(IF(date_sub(date_g, interval 10 day)< date_g, FS_1, 0)) AS 'last 10 days'
FROM
    stat_atp stat_atp
        JOIN
    backup3.players_atp ON ID1 = id_P
        JOIN
    backup3.players_atp P ON P.id_p = id2
        JOIN
    backup3.games_atp ON id1_g = id1 AND id2_g = id2
        AND id_t_g = id_t
        AND id_r_g = id_r
WHERE
    date_g > '2015-01-01'
GROUP BY ID1;

选项 2

SELECT 
    players_atp.name_p AS 'PLAYER 1',
    P.name_p AS 'PLAYER 2',
    DATE(date_g) AS 'DATE',
    result_g AS 'RESULT',
    FS_1,
    FS_2,
    SUM(CASE WHEN date_g between date_g and date_sub(date_g, interval 10 day) then fs_1 else 0 end) AS 'last 10 days'
FROM
    stat_atp stat_atp
        JOIN
    backup3.players_atp ON ID1 = id_P
        JOIN
    backup3.players_atp P ON P.id_p = id2
        JOIN
    backup3.games_atp ON id1_g = id1 AND id2_g = id2
        AND id_t_g = id_t
        AND id_r_g = id_r
WHERE
    date_g > '2015-01-01'
GROUP BY ID1;

我已经编辑了代码,现在更容易阅读和理解了。

 SELECT 
     id1 AS 'PLAYER 1',
     id2 AS 'PLAYER 2',
     DATE(date_g) AS 'DATE',
     result_g AS 'RESULT',
     FS_1,
     FS_2,
     SUM(CASE
         WHEN date_g BETWEEN date_g AND DATE_SUB(date_g, INTERVAL 10 DAY) THEN fs_1
     END) AS 'last 20 days' FROM
     stat_atp stat_atp
         JOIN
     backup3.games_atp ON id1_g = id1 AND id2_g = id2
         AND id_t_g = id_t
         AND id_r_g = id_r GROUP BY ID1;

提前感谢。

【问题讨论】:

  • 你能给我们其他的桌子吗?这会更容易理解,尤其是因为您正在为统计信息使用聚合(GROUP BY)。但是,您不应在查询 (SELECT) 的投影部分中使用条件。更适合在限制部分(WHERE)。
  • 这里有进一步规范化的空间
  • 我已经更新了代码。检查它是否更简单。

标签: mysql date if-statement sum case


【解决方案1】:

也许这可以帮助你:

SELECT 
    id1,
    SUM(fs_1)
FROM 
     stat_atp
WHERE
     date_g <= DATE_SUB('2015-03-02', INTERVAL 1 DAY) AND date_g >= DATE_SUB('2015-03-02', INTERVAL 10 DAY)
AND
    id1='Jack'
GROUP BY id1;

请记住,RDBMS 用于构建严格的数据集,这些数据集通过明确的 ID(在谈到 SQL 时)相互链接。尊重前三个范式更容易。这就是为什么您应该使用密钥来识别您的匹配项本身。通过这种方式,您可以使用子查询(子集)来实现您的目标。

然后,请记住 SQL 是结构化。这是它的力量和弱点,因为您将无法将它用作具有循环和条件的图灵完整编程语言。但在任何情况下,您都可以为查询找到相同的结构。但是,您可以使用另一种语言与 SQL 查询结果进行交互,并对结果集本身使用循环和条件。随你(由你决定。

无论如何,您可能想了解与 ISO SQL 形式不同的 MySQL GROUP BY 子句:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

【讨论】:

  • 非常感谢。我用你的实现编辑了代码,它可以工作,但不像我那样。根据您的建议,我将尝试使用 mathlab 来改进查询。
  • 不客气!如果它对你有帮助,也许你可以投票赞成这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2013-01-25
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多