SQL中重新统计用户时的队列分析

SQL中重新统计用户时的队列分析,sql,amazon-redshift,Sql,Amazon Redshift,我正在尝试使用SQL创建队列查询。 通常通过队列分析,我们观察用户,检查在特定时间执行特定操作的用户,并计算该用户是否在一段时间内执行相同的操作 WITH by_week AS (SELECT user_id, TD_DATE_TRUNC('week', login_time) AS login_week FROM logins GROUP BY 1, 2), with_first_week AS (SELECT user_id, login_week, FIRST_VALU

我正在尝试使用SQL创建队列查询。 通常通过队列分析,我们观察用户,检查在特定时间执行特定操作的用户,并计算该用户是否在一段时间内执行相同的操作

WITH by_week
AS (SELECT
  user_id,
  TD_DATE_TRUNC('week', login_time) AS login_week
FROM logins
GROUP BY 1, 2),
with_first_week
AS (SELECT
  user_id,
  login_week,
  FIRST_VALUE(login_week) OVER (PARTITION BY user_id ORDER BY login_week) AS first_week
FROM by_week),
with_week_number
AS (SELECT
  user_id,
  login_week,
  first_week,
  (login_week - first_week) / (24 * 60 * 60 * 7) AS week_number
FROM with_first_week)
SELECT
  TD_TIME_FORMAT(first_week, 'yyyy-MM-dd') AS first_week,
  SUM(CASE WHEN week_number = 1 THEN 1 ELSE 0 END) AS week_1,
  SUM(CASE WHEN week_number = 2 THEN 1 ELSE 0 END) AS week_2,
  SUM(CASE WHEN week_number = 3 THEN 1 ELSE 0 END) AS week_3,
  SUM(CASE WHEN week_number = 4 THEN 1 ELSE 0 END) AS week_4,
  SUM(CASE WHEN week_number = 5 THEN 1 ELSE 0 END) AS week_5,
  SUM(CASE WHEN week_number = 6 THEN 1 ELSE 0 END) AS week_6,
  SUM(CASE WHEN week_number = 7 THEN 1 ELSE 0 END) AS week_7,
  SUM(CASE WHEN week_number = 8 THEN 1 ELSE 0 END) AS week_8,
  SUM(CASE WHEN week_number = 9 THEN 1 ELSE 0 END) AS week_9
FROM with_week_number
GROUP BY 1
ORDER BY 1
但是现在我不太关心第一次/用户级别的分析,我只想看看我的登录行为是否随着时间的推移而增加(即,我想将第2周第一组的登录与第1周第二组的登录相加)。有没有一种简单/优雅的方法可以做到这一点

编辑:

下面举一个例子

WeekStart     Week1              Week2          Week 3
2017/05/03     66                **53**         **49**
2017/05/10  (**53**+74)        (**49**+70)      **65**
2017/05/17  (**49**+ 70 + 45)   (**65** + 80)     etc.

我认为您需要按
登录周
分组,而不是按
第一周
分组,这样您就可以在每一行中计算给定周内的所有登录人数,而不是按队列,然后您必须使用
=
而不是
=
,因此它将本周的队列与任何给定行中的所有较老队列进行汇总

WITH 
by_week AS (
    SELECT
    user_id,
    TD_DATE_TRUNC('week', login_time) AS login_week
    FROM logins
    GROUP BY 1, 2
)
,with_first_week AS (
    SELECT
    user_id,
    login_week,
    FIRST_VALUE(login_week) OVER (PARTITION BY user_id ORDER BY login_week) AS first_week
    FROM by_week
)
,with_week_number AS (
    SELECT
    user_id,
    login_week,
    first_week,
    (login_week - first_week) / (24 * 60 * 60 * 7) AS week_number
    FROM with_first_week
)
SELECT
TD_TIME_FORMAT(login_week, 'yyyy-MM-dd') AS login_week,
SUM(CASE WHEN week_number>= 1 THEN 1 ELSE 0 END) AS week_1,
SUM(CASE WHEN week_number>= 2 THEN 1 ELSE 0 END) AS week_2,
SUM(CASE WHEN week_number>= 3 THEN 1 ELSE 0 END) AS week_3,
SUM(CASE WHEN week_number>= 4 THEN 1 ELSE 0 END) AS week_4,
SUM(CASE WHEN week_number>= 5 THEN 1 ELSE 0 END) AS week_5,
SUM(CASE WHEN week_number>= 6 THEN 1 ELSE 0 END) AS week_6,
SUM(CASE WHEN week_number>= 7 THEN 1 ELSE 0 END) AS week_7,
SUM(CASE WHEN week_number>= 8 THEN 1 ELSE 0 END) AS week_8,
SUM(CASE WHEN week_number>= 9 THEN 1 ELSE 0 END) AS week_9
FROM with_week_number
GROUP BY 1
ORDER BY 1;

我用的是RedshiftI,我不太明白,但这可能会提示更多的解释:
和(1,2)中的week\u数加上week\u 1和week\u 2有什么问题。发布你拥有的和你想要的样本通常是个好主意。然后可能不是队列分析。。。我想把第2周第一组的登录和第1周第二组的登录加起来,这就意味着删除组,不是吗?只需将登录次数按周分组,从他们选择的队列中选择are@AlexYes是的,我想你是对的!但仍然不知道如何做:)@user2475110明白了。发布了一条建议,很明显!谢谢@AlexYes