对每个用户的不同访问进行计数并对它们进行分组

ne5o7dgx  于 2021-05-31  发布在  Hadoop
关注(0)|答案(2)|浏览(473)

选择用户id、总和(当单击“2020-08-01”和“2020-07-25”之间的日期时,使用不同的大小写,然后选择1,否则为空结束)总访问量为0到8天,
sum(当点击'2020-07-26'和'2020-07-18'之间的日期时,不区分大小写,否则为空结束)8到14天的总访问量,
sum(当点击'2020-07-19'和'2020-07-02'之间的日期时,不区分大小写,否则为空结束)14到30天的总访问量,
sum(当点击'2020-07-03'和'2020-06-02'之间的日期时,不区分大小写,否则为空结束)30到60天的总访问量,
sum(当点击'2020-06-02'和'2020-05-01'之间的日期时,不区分大小写,否则为空结束)60到90天的总访问量
从我的\u表按用户\u id分组
我的查询将为所有组返回null,因为我需要每个用户所需输出的总访问次数:
每个用户id在已建立的时间窗口内访问的次数总和。
我使用count distinct是为了每个日期只统计一次,所以从5月1日到8月1日,每个用户的访问量不应该超过93次,如果这样做有意义的话?谢谢您

8i9zcol2

8i9zcol21#

您应该使用日期转换,因为“单击日期”是日期。对于下面的oracle示例
另外请注意,第一个变量“2020-07-25”应该小于第二个变量“2020-08-01”,您的变量是相反的。

click_date BETWEEN TO_DATE ('2020-07-25', 'yyyy/mm/dd')
               AND TO_DATE ('2020-08-01', 'yyyy/mm/dd');
kknvjkwl

kknvjkwl2#

当你使用 BETWEEN a AND b 你必须确保 a<=b ,否则 BETWEEN 总是回来 FALSE 这就是代码中发生的事情。
所以在任何情况下都要颠倒日期。
同时使用 COUNT() 而不是 SUM() 如果要计算不同的日期:

SELECT user_id, 
  COUNT(DISTINCT CASE WHEN click_date BETWEEN '2020-07-25' AND '2020-08-01' THEN click_date END) total_visits_0to8_days,
  COUNT(DISTINCT CASE WHEN click_date BETWEEN '2020-07-18' AND '2020-07-26' THEN click_date END) total_visits_8to14_days,
  COUNT(DISTINCT CASE WHEN click_date BETWEEN '2020-07-02' AND '2020-07-19' THEN click_date END) total_visits_14to30_days,
  COUNT(DISTINCT CASE WHEN click_date BETWEEN '2020-06-02' AND '2020-07-03' THEN click_date END) total_visits_30to60_days,
  COUNT(DISTINCT CASE WHEN click_date BETWEEN '2020-05-01' AND '2020-06-02' THEN click_date END) total_visits_60to90_days
FROM my_table 
GROUP BY user_id

相关问题