查找一个月内重复访问者的数量 - PostgreSQL

Posted

技术标签:

【中文标题】查找一个月内重复访问者的数量 - PostgreSQL【英文标题】:Find number of repeating visitors in a month - PostgreSQL 【发布时间】:2014-07-10 02:54:40 【问题描述】:

我正在使用 PostgreSQL,我的数据看起来像这样:

UserID    TimeStamp
1          2014-02-03
2          2014-02-03
3          2014-02-03
1          2014-03-03
2          2014-03-03
6          2014-03-03
7          2014-03-03

这只是 2 天的虚拟数据,其中一些 UserID 在这两天都重复出现。我想知道每个月重复UserId 的次数。对于此示例,最终结果集应如下所示:

Count    Year    Month
0        2014    2
2        2014    3

在上表中,3014 年 3 月有 2 次重复 UserID,而 2014 年 2 月则没有。 我可以找出每个月不同的UserID,但找不到重复的UserID。在这方面的任何帮助将不胜感激。

【问题讨论】:

仅从上个月或全年或以往重复? 【参考方案1】:
select
    count(distinct userid) as "Count",
    extract(year from t0.timestamp) as "Year",
    extract(month from t0.timestamp) as "Month"
from
    t t1
    inner join
    t t0 using (userid)
where t0.timestamp < date_trunc('month', t1.timestamp)
group by 2, 3

或者可能更快

select
    count(distinct userid) as "Count",
    extract(year from t0.timestamp) as "Year",
    extract(month from t0.timestamp) as "Month"
from t t1
where exists (
    select 1
    from t
    where
        userid = t1.userid
        and
        timestamp < date_trunc('month', t1.timestamp)
)
group by 2, 3

【讨论】:

【参考方案2】:

这可能有效,尚未测试。

SELECT 
  COUNT(DISTINCT(UserId))
  , EXTRACT(YEAR FROM TIMESTAMP TimeStamp) AS Year
  , EXTRACT(MONTH FROM TIMESTAMP Timestamp) AS Month 
FROM TABLE 
GROUP BY TimeStamp

【讨论】:

这会给我一个月内唯一用户 ID 的数量,我想要每个月重复用户 ID 的数量【参考方案3】:

重新表述您的问题:

每个月有多少用户不是新用户(即在上个月已经访问过商店/网站/其他任何内容)?

SELECT
   yr, mon,
   COUNT(*) AS all_users,
   COUNT(*) - SUM(repeated) AS new_users,
   SUM(repeated) AS existing_users
FROM
 (
   SELECT UserId, 
      EXTRACT(YEAR FROM TimeStamp) AS yr,
      EXTRACT(MONTH FROM TimeStamp) AS mon,
      CASE WHEN ROW_NUMBER() -- 1st time users get 0
                OVER (PARTITION BY UserId
                      ORDER BY EXTRACT(YEAR FROM TimeStamp) ,
                               EXTRACT(MONTH FROM TimeStamp)) = 1 
           THEN 0 
           ELSE 1
      END AS repeated
   FROM vt
   GROUP BY UserId,
      EXTRACT(YEAR FROM TimeStamp),
      EXTRACT(MONTH FROM TimeStamp)
 ) AS dt
GROUP BY yr,mon
ORDER BY 1,2

如果一个用户在同一个月内有多行,则需要内部 GROUP BY。

【讨论】:

【参考方案4】:

这是你想要的吗?

select yyyymm, sum(case when cnt > 1 then 1 else 0 end) as dupcnt
from (select to_char(timestamp, 'YYYY-MM') as yyyymm, userid, count(*) as cnt
      from table t
      group by to_char(timestamp, 'YYYY-MM'), userid
     ) t
group by yyyymm
order by yyyymm;

【讨论】:

这个查询只给了我 0 和 1。我想要每个月重复 UserID 的总数 @Patthebug 。 . .这个查询应该返回每个月出现多次的用户 ID 总数,因为我已经修复了子查询中缺少的 userid 的语法错误。

以上是关于查找一个月内重复访问者的数量 - PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

在 Bigquery 中计算过去 3 个月内活跃的供应商数量

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

使用 sqlite 查找连续重复的数量

EXCEL - 如何在N个月内传播X数量

节点 postgres 并获得具有重复名称的连接字段

如何使用 postgres/nodejs 在表中查找特定内容