如何在sql中填充7天访问、90天访问列

kgsdhlau  于 2021-05-31  发布在  Hadoop
关注(0)|答案(3)|浏览(252)

基本上我有用户ID和点击日期,我想做的是检查一个用户是否在7天内和90天内点击过。这是我所拥有的,但它不工作,因为我没有得到任何“是”的结果,我7天的窗口,我应该(已经检查)和我得到所有的是90天窗口的结果。我希望列是分开的,因此有两个case语句。示例:如果用户已单击,则在“7天”列中的“用户id”行前面将显示“是”

SELECT user_id,  
       CASE WHEN click_date >'2020-04-30' AND click_date < '2020-05-08' 
            THEN "YES" ELSE "NO" END AS Visited_within_7_Days,
       CASE WHEN click_date >'2020-05-01' AND click_date < '2020-08-01' 
            THEN "YES" ELSE "NO" END AS Visited_within_90_Days
FROM my_table

我的输出

USER IDS    7_day _visit         
USER A          NO            
USER B          NO            
USER C          NO           
USER D          NO   

USER IDS   90_day _visit         
USER A          YES
USER B          YES
USER C          YES
USER D          YES

期望输出

USER IDS    7_day _visit       
USER A          YES          
USER B          NO           
USER C          NO       
USER D          NO            

USER IDS    90 day _visit       
USER A          YES          
USER B          NO           
USER C          NO       
USER D          YES

我已经检查了我的“点击日期”列是否包含所有日期

x9ybnkn6

x9ybnkn61#

假设您的日期比较是正确的,并且每个日期有多行,那么您需要聚合。我想这正是你想要的:

SELECT user_id,  
       MAX(CASE WHEN click_date > '2020-04-30' AND click_date < '2020-05-08' 
                THEN 'YES' ELSE 'NO'
           END) AS Visited_within_7_Days,
       MAX(CASE WHEN click_date > '2020-05-01' AND click_date < '2020-08-01' 
               THEN 'YES' ELSE 'NO'
           END) AS Visited_within_90_Days
FROM my_table
GROUP BY user_id;
cunj1qz1

cunj1qz12#

根据您关于每个用户id有多行的评论,您将需要某种聚合,否则您将得到数据库中每一行的yes/no,而不是每个不同的用户。一种选择是:

SELECT
    user_id,
    CASE WHEN last_click_date>'2020-04-30' AND last_click_date < '2020-05-08' 
            THEN 'YES' ELSE 'NO' END AS Visited_within_7_Days,
       CASE WHEN last_click_date>'2020-05-01' AND last_click_date< '2020-08-01' 
            THEN 'YES' ELSE 'NO' END AS Visited_within_90_Days
FROM (
    SELECT user_id,
       max(click_date) as last_click_date
    FROM my_table
    GROUP BY user_id
    ) as subquery
iugsix8n

iugsix8n3#

这就是我最后用的,思想?

SELECT user_id,
       CASE
           WHEN (sum(IF((click_date >'2020-04-30'
                         AND click_date < '2020-05-08'),1, 0))>0) THEN "YES"
           ELSE "NO"
       END AS Visited_within_7_Days,
       CASE
           WHEN (sum(IF((click_date >'2020-06-30'
                         AND click_date < '2020-08-01'),1, 0))>0) THEN "YES"
           ELSE "NO"
       END AS Visited_within_90_Days
    FROM my_table
    GROUP BY user_id

相关问题