Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >FIRST_VALUE和LAST_VALUE的不同数据窗口

FIRST_VALUE和LAST_VALUE的不同数据窗口
EN

Stack Overflow用户
提问于 2018-03-29 03:10:13
回答 2查看 153关注 0票数 0

下面的查询给出了奇怪的结果。看起来,FIRST_VALUE的默认窗口始终是无界的,而LAST_VALUE的默认窗口与CURRENT_ROW和CURRENT_ROW类似。为什么会这样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
to_char(INVOICEDATE,'iw') WEEK,
SUM(total) AS TOTAL_SUM,

FIRST_VALUE(to_char(INVOICEDATE,'iw')) OVER (order by SUM(total)) minimum,
FIRST_VALUE(to_char(INVOICEDATE,'iw')) OVER (order by SUM(total) DESC) maximum,
LAST_VALUE(to_char(INVOICEDATE,'iw')) OVER (order by SUM(total)) max_2,
LAST_VALUE(to_char(INVOICEDATE,'iw')) OVER (order by SUM(total) ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) max_3

from invoice

WHERE to_char(INVOICEDATE,'iw') < 9
group by to_char(INVOICEDATE,'iw')
order by to_char(INVOICEDATE,'iw')

这里的结果是:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-29 03:37:57

噢,我现在明白了。这两个函数的窗口都类似于前面和当前行的无界窗口,但是FIRST_VALUE得到了第一行,因此无论跟随多少行,它总是显示第一个结果,而LAST_VALUE总是显示CURRENT_ROW。谢谢大家!

票数 1
EN

Stack Overflow用户

发布于 2018-03-29 03:46:16

如果一次查看一个计算列,并命令输出与over子句排序相匹配,您可能会发现更容易跟踪正在发生的事情。

只适用于第一值最小值,按总数排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
  to_char(invoicedate,'iw') week,
  sum(total) as total_sum,
  first_value(to_char(invoicedate,'iw')) over (order by sum(total)) minimum
from invoice
where to_char(invoicedate,'iw') < 9
group by to_char(invoicedate,'iw')
order by total_sum;

WEEK  TOTAL_SUM MINIMUM
---- ---------- -------
08         30.7 08     
04        34.65 08     
01        35.65 08     
03        38.66 08     
05        41.58 08     
06        56.43 08     
07        59.48 08     
02        63.45 08     

您所使用的排序(在over()中)意味着由first_value处理的第一行是08,因此它看到了自己。排序中的第二行是week 04,但是它考虑了行unbounded preceding to current row,所以它看了08和04,并且接受08,因为它仍然是(并且总是按照这个顺序)。诸若此类。

对于第一个值最大值,按总降序排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
  to_char(invoicedate,'iw') week,
  sum(total) as total_sum,
  first_value(to_char(invoicedate,'iw')) over (order by sum(total) desc) maximum
from invoice
where to_char(invoicedate,'iw') < 9
group by to_char(invoicedate,'iw')
order by total_sum desc;

WEEK  TOTAL_SUM MAXIMUM
---- ---------- -------
02        63.45 02     
07        59.48 02     
06        56.43 02     
05        41.58 02     
03        38.66 02     
01        35.65 02     
04        34.65 02     
08         30.7 02     

这与前一个相反;使用该顺序的第一行用于第02周;第二行考虑02和07,并使用02,因为这仍然是(并且始终是通过该排序)。

对于最后一个值最大值,按总数排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
  to_char(invoicedate,'iw') week,
  sum(total) as total_sum,
  last_value(to_char(invoicedate,'iw')) over (order by sum(total)) max_2
from invoice
where to_char(invoicedate,'iw') < 9
group by to_char(invoicedate,'iw')
order by total_sum;

WEEK  TOTAL_SUM MAX_2  
---- ---------- -------
08         30.7 08     
04        34.65 04     
01        35.65 01     
03        38.66 03     
05        41.58 05     
06        56.43 06     
07        59.48 07     
02        63.45 02     

现在,行被按与前一个块不同的顺序考虑。排序的第一行返回到08,我们仍然使用默认的window子句,因此只能使用该子句。

第二行是第04周,只能考虑08和04;按照顺序04现在是最后看到的值。对于随后的所有行,这是相同的;最后看到的值是该行,这是因为排序。

窗口是相同的,但是您使用的排序会影响该窗口中的实际行。对于max_3计算,您将更改窗口以包含所有行;您还可以反转默认窗口,使其(实际上)与用于first_rows的窗口匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  last_value(to_char(invoicedate,'iw')) over (order by sum(total)
    rows between current row and unbounded following) max_3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49554572

复制
相关文章
Hive窗口函数04-LAG、LEAD、FIRST_VALUE、LAST_VALUE
Hive窗口函数LAG、LEAD、FIRST_VALUE、LAST_VALUE入门
CoderJed
2018/09/13
2.1K0
hive sql 窗口函数
1) 窗口函数 Lag, Lead, First_value,Last_value Lag, Lead、这两个函数为常用的窗口函数,可以返回上下数据行的数据. LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值, 与LAG相反 -- 组内排序后,向后或向前偏移 -- 如果省略掉第三个参数,默认为NULL,否则补上。
用户1217611
2020/06/19
1.2K0
hive sql 窗口函数
新特性解读 | MySQL 8.0 窗口函数一次疑问解答
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
爱可生开源社区
2022/04/06
4260
Hive 窗口函数最全讲解和实战
在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by子句之前 可以想象成sql的输出结果,就是窗口函数输入的结果。
kk大数据
2019/12/18
2.1K0
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/16
2.7K0
postgreSQL窗口函数总结
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/25
2.8K0
Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。
python与大数据分析
2022/03/11
8910
Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
【MySQL数据库】MySQL聚合函数、时间函数、日期函数、窗口函数等函数的使用
目录 前言 MySQL函数 聚合函数 数学函数 字符串函数 日期函数 控制流函数 窗口函数 序号函数 开窗聚合函数- SUM,AVG,MIN,MAX 前后函数 lag lead 首尾函数first_v
小小程序员
2022/12/15
5.3K0
【MySQL数据库】MySQL聚合函数、时间函数、日期函数、窗口函数等函数的使用
【MySQL数据库】MySQL聚合函数、时间函数、日期函数、窗口函数等函数的使用
        MySQL数据库中提供了很丰富的函数,比如我们常用的聚合函数,日期及字符串处理函数等。SELECT语句及其条件表达式都可以使用这些函数,函数可以帮助用户更加方便的处理表中的数据,使MySQL数据库的功能更加强大。本篇文章主要为大家介绍几类常用函数的用法。本期我们将介绍MySQL函数,帮助你更好使用MySQL。
小小程序员
2023/02/24
5.2K0
【MySQL数据库】MySQL聚合函数、时间函数、日期函数、窗口函数等函数的使用
用简单程序协助MySQL实现窗口函数
窗口函数是 SQL2003 标准才开始有的一系列 SQL 函数,用于应付一些复杂运算是比较方便。但是普遍使用的 MySQL 数据库对窗口函数支持得却很不好,直到最近的版本才开始有部分支持,这当然就让 MySQL 程序员很郁闷了。
星哥玩云
2022/08/17
1.4K0
用简单程序协助MySQL实现窗口函数
1 小时 SQL 极速入门(三)
今天我们讲一些在做报表和复杂计算时非常实用的分析函数。由于各个数据库函数的实现不太一样,本文基于 Oracle 12c 。
Lenis
2019/12/25
9770
1 小时 SQL 极速入门(三)
Hsql函数下_sql nvl函数
1、使用标准的聚合函数COUNT、SUM、MIN、MAX、AVG 2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列 3、使用PARTITION BY与ORDER BY语句,使用一个或者多个数据类型的分区或者排序列 4、使用窗口规范,窗口规范支持以下格式:
全栈程序员站长
2022/09/29
1.3K0
Hsql函数下_sql nvl函数
窗口函数到底有多「神奇」?
实习和秋招笔面试的时候,SQL的考察必不可少,除了题目中会涉及业务背景外,大同小异的,大都考察聚合、表连接、窗口函数,尤以各种各样的窗口函数为重。
数据森麟
2021/01/25
7820
窗口函数到底有多「神奇」?
Oracle分析函数实战
分析函数是带over的,对每行都应用分析函数,然后分析函数根据排序规则(没有排序就是没有顺序的规则,order by就是起到一个分析函数在行上滑动方向的作用)按行向下滑动,直到全部行应用分析函数完毕则分析函数结束。分析函数的计算是在当前行所属的窗口上(这个是一个结果集,每行对应的窗口总是有一个结果集)进行的,每行对应的窗口范围是由partition,order by和window子句共同决定,分析函数就根据这个范围来计算当前行的值。分析函数计算的行是在order by之前的group by,having等之后的行,这个要注意。
用户6543014
2020/06/28
6710
不要到处翻了 | Hive开窗函数总结与实践
平常我们使用 hive或者 mysql时,一般聚合函数用的比较多。但对于某些偏分析的需求,group by可能很费力,子查询很多,这个时候就需要使用窗口分析函数了~ 注:hive、oracle提供开窗函数,mysql8之前版本不提供,但Oracle发布的 MySQL 8.0版本支持窗口函数(over)和公用表表达式(with)这两个重要的功能!
大数据真好玩
2021/01/26
6.1K0
Oracle分析函数一——函数列表
今天在一个关注度颇高的技术公众号上看到一篇Oracle分析函数的文章,和我2009年写的博文很像,仔细看了一下,或许互联网上的抄袭不叫抄袭吧,愤愤然把之前的帖子翻了出来,结果还得靠申诉才能争取原创。后来修改了一会儿,还是发出去吧。
python与大数据分析
2022/03/11
7160
Oracle分析函数一——函数列表
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7590
SQL数据分析实战:好用的窗口函数
大数据快速入门(10):Hive窗口函数
首先,需要认识到,窗口函数并不是只有 hive 才有的,SQL 语法标准中,就有窗口函数。
kk大数据
2020/11/11
2.3K0
点击加载更多

相似问题

SQL first_value和last_value

31

使用GROUP与FIRST_VALUE和LAST_VALUE

21

具有空值的FIRST_VALUE和LAST_VALUE

211

使用ASC的LAST_VALUE()和带有DESC的FIRST_VALUE返回不同的结果

13

每个用户id的first_value和last_value

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文