MySQL累计和按日期分组

Joh*_*ell 12 mysql group-by date cumulative-sum

我知道有一些相关的帖子,但我的情况有点不同,我想得到一些帮助.

我需要从数据库中提取一些数据,这些数据是白天的累积交互计数.目前这就是我所拥有的

SELECT
   e.Date AS e_date,
   count(e.ID) AS num_interactions
FROM example AS e
JOIN example e1 ON e1.Date <= e.Date
GROUP BY e.Date;
Run Code Online (Sandbox Code Playgroud)

这个输出接近我想要的但不完全是我需要的.我遇到的问题是日期存储在交互发生的小时和秒之间,因此group by不会将日期分组在一起.

这就是输出的样子.http://screencast.com/t/N1KFNFyil 12-23 theres 5交互但由于时间戳不同而没有分组.所以我需要找到一种方法来忽略时间戳,只看一天.

如果我尝试GROUP BY DAY(e.Date)它只在一天之前对数据进行分组(即任何月份1日发生的所有事情都被分成一行)并且输出不是我想要的那样http://screencast.com/t/HN6DH3GV63M

GROUP BY DAY(e.Date), MONTH(e.Date) 将月份和月份的日期分开,但计数结束了.

我根本不是MySQL专家所以我对我所缺少的东西感到困惑

clh*_*ian 17

新答案

起初,我不明白你试图做一个总计.这是看起来如何:

SET @runningTotal = 0;
SELECT 
    e_date,
    num_interactions,
    @runningTotal := @runningTotal + totals.num_interactions AS runningTotal
FROM
(SELECT 
    DATE(eDate) AS e_date,
    COUNT(*) AS num_interactions
FROM example AS e
GROUP BY DATE(e.Date)) totals
ORDER BY e_date;
Run Code Online (Sandbox Code Playgroud)

原始答案

由于你的加入,你可能会得到重复.也许e1对某些行有多个匹配,这会使你的计数膨胀.您或者联接中的比较也是比较秒数,这不是您所期望的.

无论如何,不​​要将日期时间字段分成几天和几个月,而只是从中删除时间.这是你如何做到这一点.

SELECT
   DATE(e.Date) AS e_date,
   count(e.ID) AS num_interactions
FROM example AS e
JOIN example e1 ON DATE(e1.Date) <= DATE(e.Date)
GROUP BY DATE(e.Date);
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案@clhereistian(桌子只读了一次)!谢谢,这对我很有帮助.提示:如果您正在使用ORM(如PHP中的Doctrine),每次执行只能接受一个查询:在子查询中将`SET @runningTotal = 0;`替换为`@runningTotal:= 0,`:)提示还可以帮助您/我在查询之间与UNION进行多次累计求和) (2认同)

Joh*_*ell 11

我弄清楚我昨晚需要做什么...但是因为我是新手,所以我无法发布它...我做的工作是这样的:

SELECT
   DATE(e.Date) AS e_date,
   count(e.ID) AS num_daily_interactions,
   (
      SELECT 
         COUNT(id)
      FROM example 
      WHERE DATE(Date) <= e_date
   ) as total_interactions_per_day
FROM example AS e
GROUP BY e_date;
Run Code Online (Sandbox Code Playgroud)

那会比你的查询效率低吗?如果它的效率更高,我可能只是在每天拉出计数后在python中进行计算,因为这将是返回的数千到数十万行的规模.