Oracle中LAG()和LEAD()以及OVER(PARTITION BY)

LAG()和LEAD()统计函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAG和 LEAD有更高的效率。以下整理的LAG()和LEAD()例子:

LAG(EXPRESSION,<OFFSET>,<DEFAULT>)
SQL> select year,region,profit ,lag (profit,1) over (order by year)  as 51xit_exp from test;
--输出结果
YEAR REGION      PROFIT   51xit_exp
---- ------- ---------- -------------
West            88
West            88            88
Central        101            88
Central        100           101
East           102           100
West            77           102
East           103            77
West            89           103


LEAD(EXPRESION,<OFFSET>,<DEFAULT>)
SQL> select year,region,profit ,lead (profit,1) over (order by year)  as next_year_exp from test;
--输出结果
YEAR REGION    PROFIT    NEXT_YEAR_EXP
---- ------- ---------- -------------
West            88            88
West            88           101
Central        101           100
Central        100           102
East           102            77
West            77           103
East           103            89
West            89

Lag函数为Lag(exp,N,defval),defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。
Lead和Lag函数也可以使用分组,以下是使用region分组的例子:

SQL> select year,region,profit , lag (profit,1,0) over (PARTITION BY region order by year)   as 51xit_exp from test;
--输出结果
YEAR REGION    PROFIT      51xit_exp
---- ------- ---------- -------------
Central        101             0
Central        100           101
East           102             0
East           103           102
West            88             0
West            88            88
West            77            88
West            89            77

例子
如图所示的表:
在这里插入图片描述
请问 :如何查找相邻两次入住旅馆名称不同的人;也就是说 一个人的证件号码是123的话 那么这个人的信息按照入住时间排序后 相邻两条数据的旅馆名称不能一样 。

--查找同一个人下次入住不在同一旅馆的数据
SELECT 证件号码,姓名,入住时间 FROM (SELECT f.证件号码,f.姓名 ,f.入住时间, f.旅馆名称 AS f旅馆,
LEAD(旅馆名称,1) OVER(PARTITION BY 证件号码 ORDER BY 入住时间) AS n旅馆
FROM ldy_temp_2 f)
WHERE f旅馆<>n旅馆;

在这里插入图片描述
ROW_NUMBER() over(PARTITION BY … ORDER BY … ASC) AS line
按照分组和排序给每组标序号,每一组的row_number都是相同的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`LAG()`和`LEAD()`是Oracle数据库的窗口函数,它们可以用来获取指定行的上一行或下一行的值,可以在SQL查询进行偏移计算,是进行时间序列分析的重要函数。 `LAG()`函数用于获取当前行之前的一行数据,常用于计算前一行与当前行之间的差值、变化率等,其语法如下: ```sql LAG(column, offset, default) OVER (ORDER BY ...); ``` 其,`column`是要获取的列名,`offset`是偏移量,表示要获取的是当前行之前的第几行数据,`default`是可选参数,表示当获取的数据为空值时返回的默认值。`ORDER BY`子句用于指定排序规则。 举个例子,假设我们有一个`sales`表,其记录了每个店铺每个月的销售额,我们可以使用`LAG()`函数计算出每个店铺上个月的销售额和销售额变化率,如下所示: ```sql SELECT store, month, sales, LAG(sales, 1, 0) OVER (PARTITION BY store ORDER BY month) AS last_month_sales, (sales - LAG(sales, 1, 0) OVER (PARTITION BY store ORDER BY month)) / LAG(sales, 1, 1) OVER (PARTITION BY store ORDER BY month) AS sales_growth_rate FROM sales; ``` 上面的查询,我们使用了`LAG()`函数获取了每个店铺前一个月的销售额,然后计算出了销售额的变化率。 `LEAD()`函数与`LAG()`函数类似,用于获取当前行之后的一行数据,其语法如下: ```sql LEAD(column, offset, default) OVER (ORDER BY ...); ``` 下面是一个使用`LEAD()`函数的例子,假设我们有一个`logs`表,其记录了每个用户的登录时间,我们可以使用`LEAD()`函数计算出每个用户相邻两次登录时间的时间差,如下所示: ```sql SELECT user_id, login_time, LEAD(login_time) OVER (PARTITION BY user_id ORDER BY login_time) - login_time AS time_diff FROM logs; ``` 上面的查询,我们使用了`LEAD()`函数获取了每个用户下一次登录的时间,然后计算出了相邻两次登录时间的时间差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值