3

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

就像今天一样,它应该从 27-04-2013 开始计数,而昨天它应该从 26-04-2013 开始计数。表结构如下:

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_ADD(date,INTERVAL -30 day)用过

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'

这仅适用于 COUNT。我需要计算计数的总和。

4

2 回答 2

4

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

我相信你正在寻找的第一步如下。

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';

演示


我希望这是你想要的

select * from tablename 
GROUP BY uid
HAVING 
COUNT(DISTINCT myDate)>=30 
AND
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)

&

myDate BETWEEN '2013-04-27' AND '2013-04-29';
                ^^^^^^^^^^^     ^^^^^^^^^^^^

我认为myDate BETWEEN '2013-04-27' AND '2013-04-29';你应该date BETWEEN DATE_ADD(date, INTERVAL -30 day) AND CURDATE()按照 Mifeet 的答案使用。

于 2013-05-27T11:52:23.560 回答
0

我无法从这个问题中看出你是想在过去的一天还是在过去的所有日子里得到这个。如果是后者,这是您可以做到的一种方法:

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()

此外,distinct在使用group by.

编辑:

因此,在您的 Fiddle 中运行它以查看它返回数据中每一天的数字(具有 6 天的历史记录而不是 30 天):

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) ;

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

于 2013-05-27T12:45:29.043 回答