MySQL累计和按日期分组

时间:2014-03-09 00:12:06

标签: mysql date group-by 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;

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

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

如果我尝试GROUP BY DAY(e.Date)它只按天分组数据(即任何月份1日发生的所有事情都被分成一行),输出结果不是我想要的{{3} }

GROUP BY DAY(e.Date), MONTH(e.Date)按月和月份将其拆分,但计数结束了。

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

2 个答案:

答案 0 :(得分:16)

新答案

起初,我不明白你是在试图做一个总计。这是看起来的样子:

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;

原始答案

由于您的加入,您可能会收到重复项。也许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);

答案 1 :(得分: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;

这会比您的查询效率低吗?如果它的效率更高,我可以在每天提取计数后在python中进行计算,因为这将是返回的数千到数十万行的规模。