SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。
这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法(执行平台Impala)

OVER函数

1、不加条件的OVER函数——得到所有的汇总结果

select  day1, sale_money, sum(sale_money) over () as `cum_money`  from t

结果1

2、仅有排序的OVER函数——得到按顺序的累计结果

select  day1, sale_money, sum(sale_money) over (order by day1) as `cum_money`  from t

结果2

3、加分区条件的OVER函数——得到分区的汇总结果

select  day1, sale_money, sum(sale_money) over (partition by month(day1)) as `cum_money`  from t

结果3

4、加分区、排序条件的OVER函数——得到按分区后按顺序的累计结果

select  day1, sale_money, sum(sale_money) over (partition by month(day1) order by day1) as `cum_money`  from t

结果4

5、加窗口大小条件的OVER函数

current row 当前行
n preceding:往前n行
n following:往后n行
unbounded: 起点,对应前面的n

5-1 当前行和前1行

select  day1, sale_money, sum(sale_money) over (order by day1 rows between 1 preceding and current row) as `cum_money`  from t

在这里插入图片描述

5-2 当前行和前面所有行

select  day1, sale_money, sum(sale_money) over (order by day1 rows between unbounded preceding and current row) as `cum_money`  from t

在这里插入图片描述

5-3 当前行和后面所有行

select  day1, sale_money, sum(sale_money) over (order by day1 rows between current row and unbounded following) as `cum_money`  from t

在这里插入图片描述

搭配LEAD/LAG函数

lead(col,n) :往后第n行
lag(col,n) :往前第n行

-- 日期按升序排后,取当前往后的第2条数据
select day1, sale_money, 
       lead(day1,2) over (order by day1 asc) as `后第2行day1`, 
       lead(day1,2) over (order by day1 asc) as `后第2行sale_money`
from t

在这里插入图片描述

-- 日期按升序排后,取当前往前的第2条数据
select day1, sale_money, 
       lag(day1,2) over (order by day1 asc) as `前第2行day1`, 
       lag(day1,2) over (order by day1 asc) as `前第2行sale_money`
from t

在这里插入图片描述

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 1. SQL中的窗口函数实现:SQL中的窗口函数是通过OVER子句实现的。OVER子句可以在聚合函数中使用,用于指定窗口的大小和位置。窗口函数可以在分组聚合的基础上进行计算,例如计算每个分组内的排名、累计和等。 2. Pandas中的窗口函数实现:Pandas中的窗口函数是通过rolling()方法实现的。rolling()方法可以对数据进行滑动窗口计算,例如计算移动平均值、移动标准差等。rolling()方法还可以指定窗口的大小和窗口的位置,例如计算每个分组内的排名、累计和等。 3. Spark中的窗口函数实现:Spark中的窗口函数是通过Window函数实现的。Window函数可以在聚合函数中使用,用于指定窗口的大小和位置。Window函数可以在分组聚合的基础上进行计算,例如计算每个分组内的排名、累计和等。Window函数还可以指定窗口的排序方式和排序字段,例如按照时间排序、按照数值排序等。 ### 回答2: SQL窗口函数是一种强大又灵活的数据分析工具,它可以让您快速计算复杂的聚合值和行排名。在SQL中,可以通过以下三种方式来实现窗口函数: 1. 使用OVER子句:OVER子句允许您定义窗口规范,描述窗口函数如何计算,并告诉SQL如何按照特定的顺序进行排序。例如,以下查询使用AVG函数计算每个部门的平均薪水,并根据平均薪水对结果进行排序: SELECT empno, deptno, sal, AVG(sal) OVER (PARTITION BY deptno) AS avg_sal FROM emp ORDER BY avg_sal DESC; 2. 使用子查询:子查询是一种在SELECT语句中嵌套另一个SELECT语句的方法。通过使用子查询,在查询中使用窗口函数来计算聚合值。例如,以下查询使用子查询计算每个部门的平均薪水,并将结果与主查询中的每个员工的薪水进行比较: SELECT empno, deptno, sal, (SELECT AVG(sal) FROM emp e2 WHERE e2.deptno = e1.deptno) AS avg_sal FROM emp e1; 3. 使用公用表表达式:公用表表达式(CTE)是一种定义在查询中使用的命名结果集的方法。可以在CTE中定义窗口规范,并在主查询中使用窗口函数来计算聚合值。例如,以下查询使用CTE计算每个部门的平均薪水,并将结果与主查询中的每个员工的薪水进行比较: WITH dept_avg_sal AS ( SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno ) SELECT empno, deptno, sal, avg_sal FROM emp JOIN dept_avg_sal ON emp.deptno = dept_avg_sal.deptno; pandas是一种基于Python语言的数据分析库,它提供了灵活的数据处理和分析工具。在pandas中,可以使用以下三种方法来实现窗口函数: 1. 使用rolling方法:rolling方法允许您定义一个滑动窗口,并在滑动窗口内对数据进行聚合。例如,以下代码使用rolling方法计算每个员工的3个月移动平均薪水: df['rolling_avg_sal'] = df['sal'].rolling(window=3).mean() 2. 使用groupby和expanding方法:groupby方法允许您按照一个或多个列对数据进行分组,并在每个组中使用expanding方法计算聚合值。例如,以下代码使用groupby和expanding方法计算每个员工的累计平均薪水: df['cumulative_avg_sal'] = df.groupby('empno')['sal'].expanding().mean() 3. 使用apply方法:apply方法允许您使用自定义函数对数据进行操作,并返回一个新的数据集。您可以定义一个函数,该函数使用rolling、groupby和expanding等方法来计算窗口函数。例如,以下代码使用apply方法计算每个员工的移动平均薪水和累计平均薪水: def rolling_avg_sal(series): return series.rolling(window=3).mean() def cumulative_avg_sal(series): return series.expanding().mean() df['rolling_avg_sal'] = df.groupby('empno')['sal'].apply(rolling_avg_sal) df['cumulative_avg_sal'] = df.groupby('empno')['sal'].apply(cumulative_avg_sal) Spark是一种基于Scala语言的大数据处理框架,它提供了灵活的数据处理和分析工具。在Spark中,可以使用以下三种方法来实现窗口函数: 1. 使用窗口函数:Spark支持和SQL相同的窗口函数,您可以使用窗口函数来计算聚合值。例如,以下代码使用窗口函数计算每个部门的平均薪水: import org.apache.spark.sql.expressions.Window val windowSpec = Window.partitionBy("deptno") val df2 = df.withColumn("avg_sal", avg("sal").over(windowSpec)) 2. 使用groupby和agg方法:与pandas相似,Spark也支持groupby和agg方法,可以对数据进行分组和聚合。例如,以下代码使用groupby和agg方法计算每个部门的平均薪水: val df2 = df.groupBy("deptno").agg(avg("sal")) 3. 使用reduceByKey和window方法:reduceByKey方法是一种在Spark中对数据进行分组和聚合的方法。您可以使用reduceByKey方法将数据分组并计算聚合值,然后可以使用window方法来计算窗口函数。例如,以下代码使用reduceByKey和window方法计算每个部门的平均薪水: val rdd = df.rdd.map(row => (row.getInt(1), row.getDouble(2))) val windowSpec = org.apache.spark.streaming.WindowSpec .orderBy("timestamp") .partitionBy("deptno") .rowsBetween(-2, 0) val result = rdd.reduceByKeyAndWindow((x,y) => x+y, (x,y) => x-y, windowSpec) result.foreachRDD(rdd => rdd.foreach(println)) ### 回答3: 窗口函数是一种强大的数据处理工具,能够在关系型数据库和数据处理框架中实现复杂的计算和分析任务。在SQL、Pandas和Spark中,都有多种方法可以实现窗口函数,下面分别介绍它们的三种实现方式。 SQL窗口函数实现方式: SQL中常用的窗口函数有ROW_NUMBER、RANK、DENSE_RANK等,这些函数可以通过OVER子句实现。OVER子句可以将查询结果分为若干组,在每组中进行计算,并返回每个组的结果。OVER子句中的PARTITION BY子句用于指定分组的键,ORDER BY子句用于指定分组内排序的键,窗口函数可以应用在分组后的结果上。 Pandas的窗口函数实现方式: 在Pandas中,可以使用rolling函数实现窗口函数计算。rolling函数可以对数据进行滑动窗口的操作,并对窗口内的数据执行指定的计算。rolling函数包括多个参数,如窗口大小、窗口位置、计算方法等。使用窗口函数,可以进行时间序列分析、数据平滑等操作。 Spark的窗口函数实现方式: 在Spark中,窗口函数是通过Window函数实现的。Window函数可以按照指定的分区键和排序键对数据进行分区和排序,创建一个用于窗口函数计算的数据窗口,类似于SQL中的OVER子句。使用Window函数,可以进行分组统计、排序等操作。对于Spark SQL来说,Window函数支持分组窗口函数和排序窗口函数两种类型。 综上所述,SQL、Pandas和Spark中都有不同的窗口函数实现方式,可以根据具体的业务需求和数据处理场景选择合适的实现方式。在实际应用中,可根据数据量和处理能力选择处理引擎,从而获得合理的性能和灵活性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值