用于计算每周和每周访问一次的用户的 SQL 查询

Posted

技术标签:

【中文标题】用于计算每周和每周访问一次的用户的 SQL 查询【英文标题】:SQL queries for calculating users who visited at once every week and every week 【发布时间】:2015-03-24 12:46:45 【问题描述】:

我有一个包含 user_id 和登录时间的使用表。我想获取每天至少登录一次的用户数量。我还需要获取每周至少登录一次的用户数。

知道如何使用红移查询来解决它吗?

这是架构:

user_id:BigInt event_time: 日期时间

示例结果:

没有。每天至少登录一次的用户:20 每周至少登录一次的用户数:5

【问题讨论】:

请使用示例数据和所需结果编辑您的问题。 在问题中给出你的架构结构 user_id 是 BigInt,event_time 是 Datetime 字段。 到目前为止你尝试了什么?使用 generate_series() 创建从开始到结束的日期列表,并加入此列表。 其实我弄错了,这是红移。 redshift 不完全支持 generate_series。我不知道该怎么做,我在 user_id 和 DATE(event_time) 上尝试了一些分组,但没有得到任何积极的结果。 【参考方案1】:

试试这个:

/* Days range from date1 to date2 */
WITH day_range AS (
  SELECT current_date + i AS day
  FROM generate_series(DATE [$from_date] - current_date, DATE [$to_date] - current_date) i
)

/* Users logged at least once a day */
SELECT DISTINCT user_id
FROM user_event
WHERE NOT EXISTS 
  (SELECT user_id 
   FROM day_range LEFT JOIN user_event ON day_range.day = user_event.event_time::date
   WHERE user_id IS NULL)

对于每周至少登录一次的用户,它应该更复杂但类似。

【讨论】:

【参考方案2】:

这是一个伪 SQL,应该会给你你想要的。

SELECT Sum(CASE 
            WHEN daycount = datediff('day', 'start_date', 'end_date')
                THEN 1
            ELSE 0
            END) AS visited_every_day
    ,Sum(CASE 
            WHEN weekcount = datediff('week', 'start_date', 'end_date')
                THEN 1
            ELSE 0
            END) AS visited_every_week
FROM (
    SELECT user_id
        ,Count(DISTINCT to_char(event_time, 'YYYYMMDD')) AS daycount
        ,Count(DISTINCT to_char(event_time, 'WW')) AS weekcount
    FROM user_event ue
    WHERE Event_time BETWEEN 'start_date'
            AND 'end_date'
    GROUP BY user_id
    ) stage

【讨论】:

以上是关于用于计算每周和每周访问一次的用户的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 rake 任务时检查电子邮件是不是发送一次的最佳方法是啥?

用于 Google BigQuery 的 SQL 查询以计算会话和浏览量

每周统计信息的SQL查询错误

SQL 视图或表

Kotlin,WorkManager 每周重复调度一次

存储大型 SQL 数据的查询和计数的最有效方式