美文网首页SQL
窗口函数案例练习(一)

窗口函数案例练习(一)

作者: 让数据告诉你 | 来源:发表于2020-12-24 17:11 被阅读0次

    第一题:基础操作

    数据:

    #创建表格:
    create table test_window1
    (logday VARCHAR(20),
    userid VARCHAR(20),
    score int);
    
    #插入数据:
    Insert into test_window1 values
    (20191020,11111,85)
    ,(20191020,22222,83)
    ,(20191020,33333,86)
    ,(20191021,11111,87)
    ,(20191021,22222,65)
    ,(20191021,33333,98)
    ,(20191022,11111,67)
    ,(20191022,22222,34)
    ,(20191022,33333,88)
    ,(20191023,11111,99)
    ,(20191023,22222,33);
    

    操作练习:
    1)使用 over() 函数进行数据统计, 统计每个用户及表中数据的总数
    2)求用户明细并统计每天的用户总数( 使用PARTITION BY进行分区)
    3)计算从第一天到现在的所有 score 大于80分的用户总数(使用ORDER BY进行排序)
    4)计算每个用户到当前日期分数大于80的天数(使用WHERE进行条件过滤)

    1.1 使用 over() 函数进行数据统计, 统计每个用户及表中数据的总数
    
    SELECT
        *
        ,count( userid ) over ( # PARTITION BY userid ORDER BY userid
     ) AS total 
    FROM
        test_window1
    
    此处也可以使用group by和count()进行查询。
    
    
    1.2 求用户明细并统计每天的用户总数( 使用PARTITION BY进行分区)
    
    SELECT
        *,
        ,count( userid ) over ( PARTITION BY logday ) AS total 
    FROM
        test_window1
    
    此处也可以使用group by的方式进行查询,但是看不了客户的明细。
    
    
    1.3 计算从第一天到现在的所有 score 大于80分的用户总数(使用ORDER BY进行排序)
    
    题目提示从第一天到现在,所以要用 rows UNBOUNDED preceding and current row会比较严谨(虽然不指定小窗口的大小也是表里的所有时间)
    
    SELECT
        *,
        count( userid ) over ( ORDER BY score DESC rows BETWEEN UNBOUNDED preceding AND current ROW ) AS total 
    FROM
        test_window1 
    WHERE
        score > 80
    
    
    1.4 计算每个用户到当前日期分数大于80的天数(使用WHERE进行条件过滤)
    
    SELECT
        *,
        count( logday ) over ( PARTITION BY userid ORDER BY score rows BETWEEN unbounded preceding AND current ROW ) 
    FROM
        test_window1 
    WHERE
        score > 80
    
    

    相关文章

      网友评论

        本文标题:窗口函数案例练习(一)

        本文链接:https://www.haomeiwen.com/subject/dvnzgktx.html