【问题标题】:SQL queries for calculating users who visited at once every week and every week用于计算每周和每周访问一次的用户的 SQL 查询
【发布时间】: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) 上尝试了一些分组,但没有得到任何积极的结果。

标签: sql postgresql amazon-redshift


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多