Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Sql 获取滚动3个月期间的唯一用户数_Sql_Ms Access - Fatal编程技术网

Sql 获取滚动3个月期间的唯一用户数

Sql 获取滚动3个月期间的唯一用户数,sql,ms-access,Sql,Ms Access,因此,我有一个表,其中有一列用户名,然后是一列用户每次登录我们的服务时的月份1。我想得到一个独特的用户计数,查看表中每个月的滚动三个月。例如,数据如下所示: username Month Bob 01/01/2017 Joe 12/01/2017 Sam 01/01/2017 Bob 01/01/2017 Joe 12/01/2017 Frank 02/01/2017 Alice 02/01/2017 John

因此,我有一个表,其中有一列用户名,然后是一列用户每次登录我们的服务时的月份1。我想得到一个独特的用户计数,查看表中每个月的滚动三个月。例如,数据如下所示:

username  Month
Bob       01/01/2017
Joe       12/01/2017
Sam       01/01/2017
Bob       01/01/2017
Joe       12/01/2017
Frank     02/01/2017
Alice     02/01/2017
John      02/01/2017
Jen       03/01/2017
Month         Rolling3MonthUniqueUserCount
12/01/2017    1
01/01/2017    3
02/01/2017    6
03/01/2017    6
我希望我的结果是这样的:

username  Month
Bob       01/01/2017
Joe       12/01/2017
Sam       01/01/2017
Bob       01/01/2017
Joe       12/01/2017
Frank     02/01/2017
Alice     02/01/2017
John      02/01/2017
Jen       03/01/2017
Month         Rolling3MonthUniqueUserCount
12/01/2017    1
01/01/2017    3
02/01/2017    6
03/01/2017    6
查询或多个查询必须做两件事:

确定中日期后3个月的日期 桌子 获取该3个月期间内的唯一用户计数 对于我的生活,我不知道如何做到这一点,任何帮助将不胜感激。谢谢:


另外,我使用的是使用T-SQL的access。这稍微限制了您可以使用的功能

在MS Access中,最简单的方法是相关子查询

首先,您需要一份月份列表:

select distinct DateSerial(datecol), Month(datecol), 1)
from t;
然后,可以使用相关子查询获取值列表:

select m.month,
       (select count(*)
        from t
        where t.datecol >= dateadd("m", -3, m.month) and
              t.datecol < m.month
       ) as rolling_count
from (select distinct DateSerial(datecol), Month(datecol), 1) as month
      from t
     ) as m;
这将计算从第一个月开始的三个完整的前几个月。因此,1月、2月和3月的计数将在4月1日。如果您有不同的定义,可以调整查询

这在MS Access中有效吗

select m.month,
       (select count(*)
        from (select distinct name
              from t
              where t.datecol >= dateadd("m", -3, m.month) and
                    t.datecol < m.month
             ) as x
       ) as rolling_count
from (select distinct DateSerial(datecol), Month(datecol), 1) as month
      from t
     ) as m;

我不记得MS Access的范围规则。

我认为这接近正确的解决方案,但我相信它会将像用户bob这样的人计算在内,在3个月内不止一次。如果我在计数*之前添加一个select distinct,可能的解决方法是什么?