Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PostgreSQL LAG()函数可以引用它自己吗?

PostgreSQL LAG()函数可以引用它自己吗?
EN

Stack Overflow用户
提问于 2020-04-28 10:23:28
回答 1查看 711关注 0票数 1

我刚刚在PostgreSQL中发现了PostgreSQL,我一直在试验它能实现什么。我想我可以用它来计算阶乘,然后我写道

代码语言:javascript
运行
AI代码解释
复制
SELECT i, i * lag(factorial, 1, 1) OVER (ORDER BY i, 1) as factorial FROM generate_series(1, 10) as i;

在线IDE抱怨42703 column "factorial" does not exist

有什么方法可以访问以前的延迟调用的结果吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-28 10:30:29

不能在列的定义中递归引用该列。

但是,您可以将阶乘计算表示为:

代码语言:javascript
运行
AI代码解释
复制
SELECT i, EXP(SUM(LN(i)) OVER w)::int factorial
FROM generate_series(1, 10) i
WINDOW w AS (ORDER BY i ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW);
-- outputs:
 i  | factorial 
----+-----------
  1 |         1
  2 |         2
  3 |         6
  4 |        24
  5 |       120
  6 |       720
  7 |      5040
  8 |     40320
  9 |    362880
 10 |   3628800
(10 rows)

Postgresql确实支持名为递归查询的高级SQL特性,该特性还可用于递归地表示阶乘表:

代码语言:javascript
运行
AI代码解释
复制
WITH RECURSIVE series AS (
  SELECT i FROM generate_series(1, 10) i
)
, rec AS (
  SELECT i, 1 factorial FROM series WHERE i = 1
  UNION ALL
  SELECT series.i, series.i * rec.factorial 
  FROM series 
  JOIN rec ON series.i = rec.i + 1
)
SELECT * 
FROM rec;

EXP(SUM(LN(i)) OVER w) 所做的:

这利用了数学特性:

代码语言:javascript
运行
AI代码解释
复制
[1]: log(a * b * c) = log (a) + log (b) + log (c)
[2]: exp (log a) = a
[combining 1&2]: exp(log a + log b + log c) = a * b * c

SQL没有聚合乘运算,因此要执行聚合乘运算,首先要获取每个值的日志,然后可以使用sum聚合函数给出值的乘积的日志。我们用最后的指数步骤进行反演。

只要被乘的值是正的,因为对于0和负数,log是未定义的,这是有效的。如果你有负数,或者零,诀窍是检查是否有任何值是0,那么整个聚集值是0,并且检查负值的数目是否是偶数,结果是正的,否则它是负的。或者,您也可以将reals转换为复杂平面,然后使用标识Log(z) = ln(r) - iπ

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 做什么

这将声明一个展开的窗口框架,其中包括前面的所有行和当前行。

例如:

代码语言:javascript
运行
AI代码解释
复制
when i equals 1 the values in this window frame are {1}
when i equals 2 the values in this window frame are {1,2}
when i equals 3 the values in this window frame are {1,2,3}

什么是递归查询

递归查询允许您使用SQL表示递归逻辑。递归查询通常用于从关系数据(考虑管理器-报表或产品分类层次结构)生成父-子关系,但它们通常可以用于查询任何类似于树的结构。

下面是我写了一段时间的答案,它说明并解释了递归查询的一些功能。

还有大量关于递归查询的有用教程。它是一种非常强大的sql语言特性,解决了一种非常困难的问题,不需要递归。

希望这能让您更深入地了解代码的功能。学习愉快!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61487283

复制
相关文章
Oracle函数之LAG函数[通俗易懂]
  LAG是一个分析函数。它可以在不使用自连接的情况下同时访问到一个表的多行数据。给一个或多个列名和一个游标位置(位移),LAG可以访问当前行之前的行,行之间间隔的行数为位移值。   语法树中的offset(位移)参数是可选的,可以指定一个大于0的整数,如果不指定offset(位移)参数函数会默认位移为1。语法树中的default值也是可选的,这个default值是当位移值超过查询范围时函数返回行的列值的返回值,如果不指定这个值,这个值默认为null。   语法树中的{RESPECT | IGNORE} NULLS决定value_expr的null值是否包含在计算中或从计算中删除。默认是RESPECT NULLS,即包含value_expr的null值。   对于value_expr,不能使用LAG或者其他的分析函数嵌套分析函数。   value_expr的有效值是常量、列、非解析函数、函数表达式或涉及其中任何一个的表达式。
全栈程序员站长
2022/10/02
2.9K0
Oracle函数之LAG函数[通俗易懂]
Golang中函数传参存在引用传递吗?
官方文档已经明确说明:Go里边函数传参只有值传递一种方式,为了加强自己的理解,再来把每种传参方式进行一次梳理。
大愚
2018/09/13
2.3K0
Golang中函数传参存在引用传递吗?
面试官刁难:Java字符串可以引用传递吗?
老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:Java 字符串可以引用传递吗?
沉默王二
2020/02/11
5260
面试官刁难:Java字符串可以引用传递吗?
构造函数和析构函数可以是虚函数吗,在里面能调用虚函数吗
在内存上,我们知道,一个对象会有一个虚函数表,虚函数表在构造函数中初始化,可是一个对象还没有完成实例化,他的虚函数表是不存在的,一个对象需要调用构造函数完成实例化,这里形成了一个悖论
opencode
2022/12/26
1.6K0
每日一问06 构造函数可以是虚函数吗
https://www.bilibili.com/video/BV1Kb411B7N8
早起的鸟儿有虫吃
2021/01/05
7150
每日一问06 构造函数可以是虚函数吗
【AutoML】损失函数也可以进行自动搜索学习吗?
大家好,欢迎来到专栏《AutoML》,在这个专栏中我们会讲述AutoML技术在深度学习中的应用,这一期讲述在优化目标设计中的应用。
用户1508658
2019/11/07
8200
足够惊艳:神经网络可以逼近任意函数吗?
神经网络可以强大到近似逼近任意函数吗?是的。有没有一种通俗易懂、图形化的方式证明呢?
double
2018/07/25
1.1K0
足够惊艳:神经网络可以逼近任意函数吗?
main方法可以重载吗?可以被其他方法调用吗?可以继承吗?
不过自 JDK1.5 引入动态参数后,String[]数组也可以使用String... args来实现。
4xx.me
2022/06/10
1.7K0
Oracle SQL 基础:窗口函数(三)错行函数(lag,lead)的使用
今天讲一下错行函数(lag,lead)函数如何使用窗口函数。 Lag(exp_str,offset,defval) over() Lead(exp_str,offset,defval) over() --exp_str要取的列 --offset取偏移后的第几行数据 --defval:没有符合条件的默认值 下面是表“test_student_score”的全部记录。 SQL> select t.* from test_student_score t; STUDEN
SQLplusDB
2022/08/19
1.8K0
你会使用软引用和弱引用吗?
这篇文章我们来聊聊软引用和弱引用对内存性能的帮助,大家在平时的开发过程中,对于内存性能做过哪些调优工作,其中的一个方法就是我们可以使用软引用和弱引用。
故里
2020/11/25
1.1K0
你会使用软引用和弱引用吗?
Java finalize函数与软引用、弱引用、虚引用
       它不是C/C++中的析构函数,而是Java刚诞生时为了使C/C++程序员更容易接受它所做出的一个妥协”。也就是说,finalize函数最初被设计的用途是类似于C/C++的析构函数,用于在对象被销毁前最后的内存回收。Java与C/C++的相似性和不同之处在于:在C++中,对象的内存在哪个时刻被回收,是可以明确确定的(假设程序没有缺陷),一旦C++的对象要被回收了,在回收该对象之前对象的析构函数将被调用,在该函数中释放对象占用的内存;在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存,由于JVM垃圾回收运行时机是不确定的,因而finalize()的调用具有不确定性。JVM只保证方法会调用,但不保证方法里的任务会被执行完(这块儿可以从Java源码Finalizer.class中得知:在源码中,执行finalize()方法是通过开启一个低优先级的线程来执行的,而finalize()方法在执行过程中的任何异常都会被catch,然后被忽略,因而无法保证finalize方法里的任务会被执行完)。由于执行finalize()的是一个低优先级的线程,既然是一个新的线程,虽然优先级低了点,但也是和垃圾收集器并发执行的,所以垃圾收集器没必要等这个低优先级的线程执行完才继续执行。也就是说,有可能会出现对象被回收之后,那个低优先级的线程才执行finalize()方法。
saintyyu
2021/11/22
8070
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/16
2.7K0
postgreSQL窗口函数总结
查询与引用函数——offset函数
今天要跟大家分享的是一个强大的查询与引用函数——offset函数! OFFSET函数的语法参数相对比较多,但是因为参数位置和函数都比较固定,所以只要能够理解各自含义,应用起来就会很方便。 offset
数据小磨坊
2018/04/10
1.7K0
查询与引用函数——offset函数
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/25
2.8K0
PostgreSQL - 日期函数汇总
在PostgreSQL中,两个时间戳相减会得到一个interval类型的结果,如下:
雨临Lewis
2022/01/11
2.8K0
ISP举例_low input lag
从2000年9月底摄像头首次出现在手机上算起,到如今成为诸多智能设备不可或缺的一部分,便携式手机摄像头已经走过了18年的发展历程。随着手机智能化、轻薄化的发展进程,其搭载的摄像头也随之发生了变化,但基本结构并未有太大的改变。通常而言,一个摄像头硬件应包含以下五个部分:外壳(Housing)或者镜头固定物(Lens Holder)、镜头(Lens)、红外截止滤波片(IR-cut filter)、图像传感器(Image Sensor)和印制电路板(PCB)。其中,镜头、红外截止滤波片和图像传感器是组成摄像头的核心部件,也是引起Lens Shading的主要部分。
全栈程序员站长
2022/11/01
5320
ISP举例_low input lag
Tool之函数引用
ccc()和ddd()的内部操作还是正常的,但返回值溢出了;而bbb()更不幸,内部处理都乱了,说明入参就已经错了。
Taishan3721
2019/07/10
6050
内存、引用、封装、函数
内存内存分区模型代码区:存放函数体的二进制代码,由操作系统进行管理全局区:存放全局变量、静态变量和常量栈区:由编译器自动分配释放,存放函数的参数值、局部变量等堆区:由程序员分配释放,若程序员不释放,程序结束时由操作系统回收内存分区意义:不同分区存放的数据,赋予不同的生命周期,灵活编程程序运行前程序编译后,生成.exe可执行程序,未执行该程序前,分为两个区域:代码区:存放CPU执行的机器指令代码区是共享的,目的是对于频繁被执行的程序,只需要在内存中有一份代码即可代码区是只读的,防止程序意外的修改了它的指令全局
WuShF
2023/02/25
7710
内存、引用、封装、函数
Hive窗口函数04-LAG、LEAD、FIRST_VALUE、LAST_VALUE
Hive窗口函数LAG、LEAD、FIRST_VALUE、LAST_VALUE入门
CoderJed
2018/09/13
2.1K0
[1177]Hive 窗口函数之lead() over(partition by ) 和 lag() over(partition by )
lag() over() 与 lead() over() 函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前 N 行的数据 (lag) 和后 N 行的数据 (lead) 作为独立的列, 从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且 LAG 和 LEAD 有更高的效率。
周小董
2023/10/10
3K0

相似问题

JavaScript可以引用它自己吗?

30

Oracle lag函数,它可以接受列别名吗?

21

傀儡资源可以引用它自己的属性吗?

23

PostgreSQL格式lag列

10

R函数可以访问它自己的名称吗?

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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