表的数据
Case1. 计算每个文件的平均size,并只显示平均size超过30000000:
sql
select
rfi.file_name,
avg(rfi.file_size)
from
raw_file_info rfi
group by
rfi.file_name
having
avg(rfi.file_size)>30000000;
解析
这个查询使用了 GROUP BY 子句进行分组,AVG () 函数计算平均值,HAVING 子句用于过滤分组后的结果。
Case2. 查询表中每个文件size最大的:
sql
select
rf.file_name ,rf.file_size
from
raw_file_info rf
join (
select
file_name,
max(file_size) as max_size
from
raw_file_info
group by
file_name ) as mf on
rf.file_name = mf.file_name and rf.file_size =mf.max_size
解析
通过子查询找出每个文件size最大的
使用外层查询关联的文件名
Case3.找出size高于平均size的所有文件:
sql
select
*
from
raw_file_info rfi
where
rfi.file_size >(
select
avg(rf.file_size)
from
raw_file_info rf);
解析
这个查询使用了子查询来计算平均size,然后在主查询中使用这个结果进行比较。
Case4. 查询表中所有重复的文件名称及其出现次数
sql
select
rfi.file_name,
count(*)
from
raw_file_info rfi
group by
rfi.file_name
having
count(*)>1;
解析
使用 GROUP BY
对名字分组。
HAVING
子句筛选分组后的数据。
考查聚合和过滤的结合使用。
Case5. 查询排名(降序排列)
sql
select
rfi.file_name ,
rfi.file_size ,
rank() over(
order by rfi.file_name desc,
rfi.file_size desc) as rank
from
raw_file_info rfi ;
解析
使用窗口函数 RANK()
实现排名。
考查窗口函数的使用。
Case6. 对于每个文件,查找size排名前十的文件
sql
select
*
from
(
select
rfi.file_name ,
rfi.file_size ,
row_number() over(
order by
rfi.file_size desc) as rank
from
raw_file_info rfi) t
where
t.rank <= 10;
解析
这个查询使用了窗口函数 DENSE_RANK () 来为每个文件根据size进行排名,然后在外部查询中筛选出排名前十的记录。