第一题:基础操作
数据:
#创建表格:
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
网友评论