1

我的示例表:

+----------+---------------------+
| username |        time         |
+----------+---------------------+
| john     | 2013-02-04 17:39:43 |
| john     | 2013-02-03 00:21:31 |
| peter    | 2013-02-02 15:04:53 |
| grace    | 2013-02-02 03:57:43 |
| peter    | 2013-02-03 15:36:15 |
+----------+---------------------+

此表记录来自用户的活动。我需要统计上次活动日期超过 30 天的用户数量。

我开发了这个查询:

SELECT
  username,
  MAX(time),
  DATEDIFF(NOW(), MAX(time)) as diff
FROM tracking
GROUP BY username
HAVING diff > 30

它有效地返回了活动超过 30 天的用户列表,以及最后一次活动的日期。

但我需要这个列表的计数,而不是列表本身。有什么办法可以计算列表吗?

笔记:

  • 我只能依靠SQL语句,我不能使用PHPASP或其他任何东西。
  • 我不能使用STORED PROCEDURES
  • 我不需要性能,因为这个语句只会偶尔运行一次。
4

2 回答 2

2

这是一个比较简单的方法:

SELECT count(distinct username) - 
       count(distinct case when DATEDIFF(NOW(), time) <= 30 then username end) as numusers
FROM tracking

这需要用户总数并减去过去 30 天内有活动的用户数。

于 2013-02-25T19:49:38.567 回答
2

就这样?

Select count(*) as Num FROM
  (
 SELECT
   username,
    MAX(time),
     DATEDIFF(NOW(), MAX(time)) as diff
     FROM tracking
 GROUP BY username
 HAVING diff > 30
 )
于 2013-02-25T19:48:32.140 回答