Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 每日计数总和_Mysql_Count_Sum - Fatal编程技术网

Mysql 每日计数总和

Mysql 每日计数总和,mysql,count,sum,Mysql,Count,Sum,我需要计算唯一用户ID的总数,以计算每月的唯一用户,这需要每天进行。也就是说,对于今天,它必须显示从今天开始的30天前的总和,对于昨天,它需要计算从昨天开始的30天前的总和 就像今天一样,它应该从2013年4月27日开始计算,昨天从2013年4月26日开始计算。表结构如下所示: date uid visits 27-04-2013 11 45 27-04-2013 11 45 26-04-2013 11 45 25-04-2013 11

我需要计算唯一用户ID的总数,以计算每月的唯一用户,这需要每天进行。也就是说,对于今天,它必须显示从今天开始的30天前的总和,对于昨天,它需要计算从昨天开始的30天前的总和

就像今天一样,它应该从2013年4月27日开始计算,昨天从2013年4月26日开始计算。表结构如下所示:

date        uid   visits
27-04-2013   11     45
27-04-2013   11     45
26-04-2013   11     45
25-04-2013   11     45
24-04-2013   11     45
这有点像运行总数,但只有30天

我使用了
DATE\u ADD(日期,间隔-30天)
如下所示

SELECT DISTINCT date,COUNT(uid) FROM tablename 
WHERE DATE_ADD(date,INTERVAL -30 day) AND date GROUP BY date
但与此查询相比,我得到了不同的结果

SELECT COUNT( `uID` )
FROM tablename
WHERE date
BETWEEN '2013-04-27'
AND '2013-05-27'
这只供计数。我需要计算计数的总和

请不要在列名中使用MySQL保留关键字。因此,我在查询中将
date
更改为
myDate

我相信第一步你会看到如下

select myDate, sum(visits) as 'Total Visits' from tablename GROUP BY myDate;

对于上月数据,请使用下面的查询

select myDate, sum(visits) as 'Total Visits' from tablename
GROUP BY myDate
HAVING myDate BETWEEN '2013-04-27' AND '2013-05-27';

我希望这就是你要找的

select myDate, uid, COUNT(visits) as 'Total Visits' from tablename
GROUP BY myDate
HAVING myDate BETWEEN '2013-04-27' AND '2013-05-27';

我希望这就是你想要的 为了演示,我在下面的演示链接中使用了3天的数据。

注:更改将显示在下面的行中

COUNT(DISTINCT myDate)>=3
                        ^^ --> This would be number of days in month (as I am using 3 days only, I have 3)
&


我认为我的日期在'2013-04-27'和'2013-04-29'之间根据Mifeet答案,您应该使用日期之间的日期(日期,间隔-30天)和CURDATE()。

我无法从问题中判断您是在一天内还是在过去的所有天内尝试获取此信息。如果是后者,这里有一种方法可以做到:

SELECT DATE_ADD(date,INTERVAL n.n day) as thedate,
       COUNT(distinct uid) as numUsers, sum(visits) as totVisits
FROM tablename t cross join
     (select 0 as n union all select 1 union all select 2 union all
      select 3 union all select 4 union all select 5 union all
      . . .
      select 27 union all select 28 union all select 29
     ) n 
group by DATE_ADD(date,INTERVAL n.n day) ;
您的第一个查询:

SELECT DISTINCT date,COUNT(uid)
FROM tablename 
WHERE DATE_ADD(date,INTERVAL -30 day) AND date
GROUP BY date
它有两个缺点。首先,
where
子句不是布尔值。我想你的意思是:

where date between DATE_ADD(now(),INTERVAL -30 day) AND now()
另外,在使用
分组依据时,您不需要使用
不同的
(也不应该有!)

编辑:

因此,在您的小提琴中运行此命令,查看它是否返回数据中每天的数字(历史记录为6天而不是30天):

选择日期\u添加(mydate,间隔n.n天)作为日期,
将(不同的uid)计数为NUMUSER,将(访问)总和计数为TOT访问
从表名t交叉连接
(选择0作为n全部联合选择1全部联合选择2全部联合
选择3全部联合选择4全部联合选择5
)n
其中DATE_ADD(mydate,INTERVAL n.n day)

您会注意到它跳过了没有用户的日期。

哪个查询给出了正确的结果:第一个或第二个?@user4035第二个查询,因为它直接计算给定日期的计数。@AlwinAugustin“计算唯一用户ID的计数之和”-因此您问题中的示例数据的正确结果是4,因为用户11在四天内访问过?@Mifeet在本例中为1,因为同一用户每天访问。我实际上需要30天内的唯一用户。@AlwinAugustin:让我澄清一下。。您需要一个每天(连续30天)访问的用户id(uid)。。。对吗?你确定他需要访问次数的总和吗?他说,他需要计算每30天的唯一UID,然后求和。这不是访问量的总和。它是唯一UID计数的总和。@AlwinAugustin:我已经更新了答案。。请让我知道这是否是您正在寻找的?事实上,我需要这样的选择计数(DISTINCT
uID
),因为我需要counts@AlwinAugustin:考虑到我在sqlfiddle的数据,您能告诉我您期望的输出是什么吗?您指的是一个月内的唯一访客总数?过去所有天数的唯一访客总数。与过去7天、过去30天或到基于筛选器的指定日期之间类似。所以我需要在查询中添加所有日期?@AlwinAugustin。如果您只希望最近的日期有一行,那么您可以在问题中使用查询的变体。此解决方案展示了如何使用数字表获取数据中所有日期的值。如果你必须在任何天数内定期这样做,那么创建一个数字表,其中包含足够大的数字集。所以我需要创建另一个带有日期的表?日期已经在我的桌子上了。请检查这把小提琴,我实际需要的是5月27日10,5月26日9,5月26日9到10,因为两者之间没有日期
SELECT DISTINCT date,COUNT(uid)
FROM tablename 
WHERE DATE_ADD(date,INTERVAL -30 day) AND date
GROUP BY date
where date between DATE_ADD(now(),INTERVAL -30 day) AND now()
SELECT DATE_ADD(mydate, INTERVAL n.n day) as thedate,
       COUNT(distinct uid) as numUsers, sum(visits) as totVisits
FROM tablename t cross join
     (select 0 as n union all select 1 union all select 2 union all
      select 3 union all select 4 union all select 5 
     ) n 
where DATE_ADD(mydate, INTERVAL n.n day) < now()
group by DATE_ADD(mydate, INTERVAL n.n day) ;