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)
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中进行计算,因为这将是返回的数千到数十万行的规模.