SQL学习笔记(一)排序和求众数

排序 

1、row_number() over(partition by col1 order by col2):相等的值对应的排名相同,序号从1到n连续。

`Species`;`Sepal_Width`;`count`;row_number() over (partition by `Sepal_Width` order by `count` desc) as num


2、rank() over(partition by col1 order by col2):但若有并列的名称,会占用下一名次的,则序号从1到n不连续。如果有两个人都排在第3名,则没有第4名。

`Species`;rank() over (order by `Species`) as rank

3、dense_rank() over(partition by col1 order by col2):但若有并列的名称,不会占用下一名次的,则序号从1到n连续。如果有两个人都排在第3名,则下一名还是第4名。

`Species`;dense_rank() over (order by `Species`) as dsr


4、ntile( n ) over(partition by col1 order by col2):将每个分区内排序后的结果均分成N个桶,排序对应的数字为桶号。如果不能平均分配,则较小桶号的桶分配额外的行,并且各个桶中能放的数据条数最多相差1。

`Sepal_Width`;`Species`;ntile(4) over (order by `Species`) as ntile)(以Species列均分四桶)

众数(sentosa)

1、求平均数等可以利用count;

2、求众数:

方法1(SQL算子):

select Sepal_Width,count(1) from $iris

group by 1

order by 2 desc

limit 1

(需要在查表时,给表名加上$)

方法2(PySpark算子):

# 初始化 Spark 会话
spark = SparkSession.builder.appName("IrisAnalysis").getOrCreate()

# 读取 iris 数据表为 DataFrame
iris_df = spark.read.csv("/home/sentosa/project/iris.csv", header=True, inferSchema=True)

# 计算 Sepal_Width 的频率并选择出现次数最多的记录
output_data = (iris_df
               .groupBy("Sepal_Width")              
               # GROUP BY Sepal_Width
               .agg(count("*").alias("count"))      
               # COUNT(*)
               .orderBy("count", ascending=False)   
               # ORDER BY count DESC
               .limit(1))                        
               # LIMIT 1

# 显示结果
output_data.show()

方法3:

聚合-->排序desc-->过滤

方法4:利用两个选择算子嵌套查询

1、count(`Sepal_Width`)over(partition by `Sepal_Width`) as count

2、sum(‘count’)
方法5:聚合后选择算子查询

1、count聚合

2、max(‘count’)

注意:group by是分组,对行数有影响。窗口函数(count() over(), sum() over()等)和group by的语法不同,不能混合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值