SQL

窗口函数案例练习(一)

2020-12-24  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读