PG实践|内置函数之GENERATE_SERIES之深入理解

news2024/10/10 8:21:38

在这里插入图片描述

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

目录

  • 背景
  • 1关于内置函数
  • 2GENERATE_SERIES
    • 2.1 释义
    • 2.2 用法
      • 用法一
      • 用法二
      • 用法三
    • 2.3 注意
  • 错误根因分析
  • 总结

背景

近期在做一些数据处理的工作,工作中使用其他项目组平台来做数据开发,在数据开发过程中,使用了PostgreSQL的一个内置函数 GENERATE_SERIES。在本地测试执行时,并没有什么问题出现,而在项目组开发的平台执行SQL脚本时报错,具体错误提示信息如下:

[ERRORI>> 2024-06-13 09:41:56-执行语句异常【EXECUTE SOL GREENPLUM
ERROR{message=ERROR: function generate_series(double precision, double
precision, integer) does not exist}

在拿到错误信息时,第一想法就是直接拿着SQL找到数据库管理员,让其协助测试下这个内置函数(GENERATE_SERIES)是否可用。当数据库管理员的发回截图时,我瞬间被懵掉了,这个函数的确存在,而且也可以执行,并有正确的结果输出出来,那么错误的具体原因是什么?为何会出现这个问题呢?下面就开始随我一探究竟吧。

1关于内置函数

对于SQL中的内置函数,应该不会太陌生。所谓内置,就是在安装服务软件后就已存在的函数,它对应的应该是UDF(用户自定义函数)。在SQL中,有许多内置函数(或称为系统函数、内建函数)可用于处理数据。这些函数允许你执行复杂的计算、转换数据类型、处理字符串和日期等。通俗一点讲就是预定义好的功能,用于执行特定任务(也可以说是一个工具类),如处理数据、进行数学运算、处理字符串、日期和时间等。不同的数据库系统(如MySQL、PostgreSQL、SQL Server、Oracle等)可能支持不同的函数集,但许多基本函数在各种系统中都是通用的。

2GENERATE_SERIES

2.1 释义

【函数释义】:数据集函数,按照一定参数规则返回数据集。主要用于生成示例数据或一些有规律的记录,generate_series允许您生成一组从某个点开始,到另一个点结束的数据,并可选择设置递增值。

当前测试(实验)环境为PostgreSQL 16.2,所有操作均以这个版本进行测试(这个后续会有说明)。
在这里插入图片描述

2.2 用法

在PostgreSQL的官网有如下三种的用法和描述。
【语法结构】

generate_series ( start integer, stop integer [, step integer ] ) → setof integer
generate_series ( start bigint, stop bigint [, step bigint ] ) → setof bigint
generate_series ( start numeric, stop numeric [, step numeric ] ) → setof numeric
generate_series ( start timestamp, stop timestamp, step interval ) → setof timestamp
generate_series ( start timestamp with time zone, stop timestamp with time zone, step interval [, timezone text ] ) → setof timestamp with time zone

【参数】
从上面的函数结构中,可以看到generate_series这个函数支持三种类型的输入参数,分别为integer、bigint、numeric 。如果对这三个函数还没有理解,可以去官网查阅具体的使用方法,或者期待下一篇吧,到时候会详细讲讲。其中,第一个输入参数为开始参数,第二个参数为结束参数,第三个参数(可选,默认不填写时,步长为 1 )为步长。而在返回结果中也是对应到输入参数。

【integer示例】
举例说明下吧,例如我想返回数字 1 到 8 所在范围中步长为1的所有数据(这里可以理解为从1开始计算,在8范围内的所有数据,如果使用N表示数据集,从数学公式上面可以表示为 1 <= N <= 8 或者集合 [1, 8])。当步长为负数时(例如 -2 ),则相反。具体的计算步骤为:

用法一

start <= stop,step = 1时,如果步长为1时,那就是

n1为,start = 1
n2为,n1+1 = 2
n3为,n2+1 = 3
n4为,n3+1 = 4
……
n8为,n7+1 = 8
n9为,n8+1 = 9,此时,结果9>8,不满足在[1,8]集合的范围内,所以舍弃,最终的返回结果如下:
在这里插入图片描述

用法二

start <= stop,step = 2时,如果步长为2时,那就是

n1为,start = 1
n2为,n1+2 = 3
n3为,n2+2 = 5
n4为,n3+2 = 7
n5为,n4+2 = 9,此时,结果9>8,不满足在[1,8]集合的范围内,所以舍弃,最终的返回结果如下:
在这里插入图片描述

用法三

start >= stop,step = -2时,如果步长为 -2 时(反向获取数据),那就是
n1为,start = 8
n2为,n1+(-2) = 6
n3为,n2+(-2) = 4
n4为,n3+(-2) = 2
n5为,n4+(-2) = 0,此时,结果0<1,不满足在[8,1]集合的范围内,所以舍弃,最终的返回结果如下:
在这里插入图片描述

示例中涉及到的代码如下:

select generate_series(1, 8, 1) as N ;

select generate_series(1, 8, 2) as N ;

select generate_series(8, 1, -2) as N ;

2.3 注意

这里需要特别注意下,返回 0 行的情况有如下几个:当步长为正时,如果start大于stop,则返回零行。相反,当步长为负时,如果start小于stop,则返回零行。NULL输入也返回零行。步长不能为 0 。

此时需要注意,特别留意这里的写法以及需要实现的功能。

当 start 大于 stop时,此时开始值为8,加上步长 2 后,为 10,不符合数据集规则,则返回0行。
当 start 小于 stop时,此时开始值为8,加上步长-2 后,为 6,不符合数据集规则,则返回0行。

select generate_series(8, 1, 2) as N ;
select generate_series(1, 8, -2) as N ;

在这里插入图片描述

在这里插入图片描述

错误根因分析

下面是我写SQL的步骤:
步骤1 套用语法后的原始SQL

select generate_series(2019, 2023, 1) as N;
2019
2020
2021
2022
2023

步骤2 根据业务,获取参数年份前5年的年份数据集,此时想获取的数据集为 2019,2020,2021,2022,2023。

select generate_series('2023' - 4, '2023', 1) as N;
2019
2020
2021
2022
2023

步骤3 我在这里又做了一次画蛇添足,将’2023’转为了 timestamp 类型,最终导致在 PostgreSQL 12版本中无法执行。

在排查根因分析时,错误信息提示我有一个double的参数,可能是哪里写错了,后来才发现是版本的问题。这个错误提示也是让我摸不到头脑。
● 在PostgreSQL最新开发版本17.x 中
在这里插入图片描述

● 在PostgreSQL 13.x~16.x以及
在这里插入图片描述

● 在PostgreSQL 12.x 以及以前版本中
在这里插入图片描述

总结

遇事不要慌,多看看官网,多找找原因,实在不行多翻一翻其他的博文,总有能帮助你的那一刻。下一篇总结下其他参数的使用方法。


[引用]

  1. PostgreSQL 16(generate_series):https://www.postgresql.org/docs/16/functions-srf.html
  2. PostgreSQL 12(generate_series):https://www.postgresql.org/docs/12/functions-srf.html

欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1862970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

【神经网络】CNN网络:深入理解卷积神经网络

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&#xff01; CNN网络&#xff1a;深入理解…

VideoLLaMA 2:多模态视频理解新突破,音频理解能力再升级,挑战 GPT-4V

前言 近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大模型的出现&#xff0c;为视频理解和生成领域带来了前所未有的机遇。然而&#xff0c;现有的视频大模型&#xff08;Video-LLM&#xff09;在处理视频中复杂的时空信息和音频信息方面仍存在不足&#xff0c;例…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

笔记101:OSQP求解器的底层算法 -- ADMM算法

前言1&#xff1a;这篇博客仅限于介绍拉格朗日乘子法&#xff0c;KKT条件&#xff0c;ALM算法&#xff0c;ADMM算法等最优化方法的使用以及简版代码实现&#xff0c;但不会涉及具体的数学推导&#xff1b;不过在下面我会给出具体数学推导的相关文章和截图&#xff0c;供学有余力…

Elasticsearch:使用 Llamaindex 的 RAG 与 Elastic 和 Llama3

这篇文章是对之前的文章 “使用 Llama 3 开源和 Elastic 构建 RAG” 的一个补充。我们可以在本地部署 Elasticsearch&#xff0c;并进行展示。我们将一步一步地来进行配置并展示。你还可以参考我之前的另外一篇文章 “Elasticsearch&#xff1a;使用在本地计算机上运行的 LLM 以…

在线epub阅读器epub;在线图书阅读器;专门为epub定制的阅读器;免费在线电子图书epub阅读器

背景&#xff1a;不记得某时某刻了&#xff0c;就是当时想要使用电脑阅读epub图书&#xff0c;也找了好些个在线epub阅读器&#xff0c;但总有一些不如意的地方&#xff0c;如某些功能需要会员之类的&#xff0c;突发临想的就想到自己开发一个&#xff0c;就此&#xff0c;一个…

大模型RAG技术:构建高效、可信赖的知识检索系统

前言 LLM 问题 幻觉&#xff1a;在没有答案的情况下提供虚假信息。 过时&#xff1a;当用户需要特定的当前响应时&#xff0c;提供过时或通用的信息。 来源&#xff1a;从非权威来源创建响应。由于术语混淆&#xff0c;不同的培训来源使用相同的术语来谈论不同的事情&#…

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码+编号 检测,后续裁剪出图片并摆正显示

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码编号 检测&#xff0c;后续裁剪出图片并摆正显示 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-06-25T10:59:15.206586 description&#xff1a;…

第一课:SSH协议、SSHD守护进程、Openssh软件包

第一节课 6月12日 ssh协议 关键问题 一、ssh、sshd、openssh的概念和区别&#xff1f; 二、ssh是基于什么架构&#xff1f;B/S还是C/S&#xff1f; 三、用户远程连接服务器经历哪些过程&#xff1f; 四、如何查看openssh软件包是否安装&#xff1f; 五、rpm和yum的区别&#xf…

node带参数命令

不带参数命令示例&#xff1a; node /www/wwwroot/server 带参数命令示例&#xff1a; node /www/wwwroot/server arg1 arg2 arg3 在启动页进行参数处理&#xff1a; // 获取启动参数(除去前2个默认参数&#xff0c;示例&#xff1a;node /www/wwwroot/server arg1 arg2 …

SAP ABAP 之容器

文章目录 前言一、案例介绍/笔者需求二、自定义容器 a.实例化对象 b.自定义容器效果演示 c.Copy Code 三、自适应容器 a.常用 必须 参数理解 b.METRIC 度量单位 c.RATIO 百分比尺寸 d.STYLE 容器…

WMV 视频格式怎么转换?WMV 视频为什么不流行了?

目前有越来越多的视频格式类型&#xff0c;如常见的 MP4、FLV、AVI 等等&#xff0c;而技术的演变也逐渐让一些常见的视频格式变的越来越少了。 今天我们一起来聊下 WMV 这个视频格式&#xff0c;让我们看看它的发展以及为什么现在越来越少人使用了。 什么是 WMV 视频格式&…

微信营销自动化(朋友圈自动点赞工具):UIAutomation的解决方案

文章不用看, 是AI生成的, 请直接查看下载地址 http://www.aisisoft.top . 微信朋友圈自动点赞工具, 自动群发工具 在当今的数字化营销领域&#xff0c;自动化工具成为了提升工作效率、增强客户互动的关键。本文将详细介绍一款基于UIAutomation框架与Python语言构建的微信营销自…

数据容器(四)

目录 一、dict&#xff08;字典、映射&#xff09; 1.字典的定义 2.字典数据的获取 3.字典的嵌套 一、dict&#xff08;字典、映射&#xff09; 1.字典的定义 使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对。 2.字典数据的获取 字典同集合一样&#xff…

PointCloudLib-滤波模块(Filtering)-使用统计异常值移除过滤器移除异常值

在本教程中,我们将学习如何消除噪声测量值,例如异常值, 使用统计分析技术的点云数据集。 背景 激光扫描通常会生成不同点密度的点云数据集。 此外,测量误差会导致稀疏异常值,从而破坏 结果更多。这使得本地点云的估计变得复杂 表面法线或曲率变化等特征,导致 错误的值,…

【WEB】关于react的WEB应用中使用React Developer Tools便捷快速查看元素数据

1、往扩展工具中添加React Developer Tools的扩展包 2、检查是否生效&#xff0c;如下图&#xff1a; 可以看到右上角多出来一个Components的tab选项&#xff0c;就是成功了

转运机器人:智能物流的得力助手

在物流行业&#xff0c;转运机器人已经成为提高转运效率、降低成本的重要工具。而富唯智能转运机器人凭借其出色的性能和智能化的设计&#xff0c;成为了众多企业的得力助手。 富唯智能转运机器人采用了先进的AMR控制系统&#xff0c;可以一体化控制移动机器人并实现与产线设备…

美国众议院通过ENFORCE ACT草案:AI领域的潜在冷战?

近日&#xff0c;美国众议院通过了“增强关键出口海外限制国家框架法案”&#xff08;ENFORCE ACT&#xff09;&#xff0c;该法案旨在限制AI/ML技术和人才向中国的流动。这一举动引发了广泛讨论和担忧&#xff0c;许多人认为这将对在美从事AI相关工作的中国人造成重大影响。本…

【力扣】重排链表

&#x1f525;博客主页&#xff1a; 我要成为C领域大神 &#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于分享知识&#xff0c;欢迎大家共同学习和交流。 给定一个单链表…