【问题标题】:Tracking the change of status of a user跟踪用户状态的变化
【发布时间】:2019-03-03 01:29:38
【问题描述】:

我正在尝试编写查询逻辑,这将允许我对用户活动进行分类:

• 问题是一个表,其中包含大约 5 分钟的时隙中的所有用户活动(并非所有都恰好是 5 分钟,有些是 3 分钟,其他是 4 分钟),并记录每个用户在特定状态下花费的时间量.

• 用户通常会在一天中的状态之间跳转。

问题:如果用户连续使用超过 3 小时(180 分钟)而不改变其状态,则必须将其报告为:“未分类”

我正在工作的表的当前视图:

user_id record_date user_status
user1   9/3/2017 14:25  status_1
user1   9/3/2017 14:30  status_3
user1   9/3/2017 14:35  status_3
user1   9/3/2017 14:40  status_2
user1   9/3/2017 14:45  status_2
user1   9/3/2017 14:50  status_2
user1   9/3/2017 14:55  status_2
user1   9/3/2017 15:00  status_2
user1   9/3/2017 15:05  status_2
user1   9/3/2017 15:10  status_2
user1   9/3/2017 15:15  status_2
user1   9/3/2017 15:20  status_2
user1   9/3/2017 15:25  status_2
user1   9/3/2017 15:30  status_2
user1   9/3/2017 15:30  status_2
user1   9/3/2017 15:35  status_2
user1   9/3/2017 15:40  status_2
user1   9/3/2017 15:43  status_3
user1   9/3/2017 15:45  status_3
user1   9/3/2017 15:50  status_2
user1   9/3/2017 15:50  status_2
user1   9/3/2017 15:55  status_2
user1   9/3/2017 16:00  status_2
user1   9/3/2017 16:00  status_2
user1   9/3/2017 16:04  status_2

我开始测试下面的逻辑,但是一旦我发现每个槽不完全是 5 分钟,我就无法继续。

SELECT user_id ,record_date
            ,CASE 
                  WHEN SUM(status_1) OVER (
                              PARTITION BY user_id ORDER BY record_date ASC ROWS BETWEEN 35 PRECEDING
                                          AND current row
                              ) >= 180
                        THEN 1
                  ELSE 0
                  END AS unclassified_flag

--2
  ,CASE 
                  WHEN SUM(status_2) OVER (
                              PARTITION BY user_id ORDER BY record_date ASC ROWS BETWEEN 35 PRECEDING
                                          AND current row
                                  ) >= 180
                            THEN 1
                      ELSE 0
                      END AS unclassified_flag
FROM table

任何关于替代逻辑的想法都非常感谢

【问题讨论】:

  • 刚刚更新了更正的标签。
  • Postgres 与 Redshift 非常不同。你真的两个都用吗?
  • 没什么不同:Amazon Redshift 基于 PostgreSQL 8.0.2
  • 它们非常不同:docs.aws.amazon.com/redshift/latest/dg/… "不要假设 Amazon Redshift 和 PostgreSQL 的共同元素的语义是相同的"
  • 您审核的时间段是多长?一天?一周?永远?

标签: sql amazon-redshift


【解决方案1】:

查看窗口函数LAG()https://docs.aws.amazon.com/redshift/latest/dg/r_WF_LAG.html

您可以为每一行添加前一个时间戳,然后您可以简单地获取间隔时间并按状态分组。唯一的缺点是它会包括用户不活动的时间,所以你可能想扔掉大的东西。

例如

with status_intervals as (
SELECT
  user_id, status, record_date
  ,lag(record_date) OVER (PARTITION BY user_id ORDER BY record_date) as last_date
FROM
  table
)
SELECT
  user_id, status
  ,sum(datediff(second, last_date, record_date)) as total_time_in_status
FROM
   status_intervals
WHERE
   datediff(second, last_date, record_date) < 900 --arbitrarily deciding 15min is likely inactive
GROUP BY
   user_id, status

【讨论】:

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