[pgrx开发postgresql数据库扩展]7.返回序列的函数编写(2)表序列

news2024/9/24 7:26:03

前文再续,书接上一回。

上一节我们简单说了利用SetOfIterator返回一个srf(Set Returning Functions),但是很多情况下,一个单值序列并不能很好的满足我们的需求,所以今天我们来说另外一个作用更广泛的srf:

TableIterator

顾名思义,SetOfInterator返回的是一个Set,那么TableIterator返回的自然是一个表格了,下面先来看一个例子:

代码如下:(具体说明后面再说)

#[pg_extern]
fn get_values() -> 
TableIterator<'static, (name!(index, i32), name!(value, f64))> {
    let v:Vec<(i32,f64)> = vec![
        (1,0.5),
        (2,0.33),
        (3,0.15),
        (4,0.35)
    ];
    TableIterator::new(v)
}

效果如下:

有同学说,虾神,你出来的这个内容,不是表格啊,每行怎么都是一个tuple呢?

别急,我们换一个写法:

对比一下我们的接口,就很明显了,我们在函数里面定义的返回类型,正好对应生成的表格中的字段,而TabletIterator里面的值,就正好对应了生成的表格里面的值:

下面我们来简单解析TabletIterator这个返回类型的代码:

/**
语法:
TableIterator<'生命周期标识, 
        (
            name!(字段名1, 字段类型1), 
            name!(字段名2, 字段类型2),
            name!(字段名n, 字段类型n),……
        )
        >
其中,name!是Rust的定义的宏,里面的参数一个是tuple,用于声明返回值的结构,尤其是返回值为表迭代器的函数中提供 SQL 名称。
*/
//示例:
TableIterator<'static,
        (
            name!(id, i64),
            name!(dept_code, String),
            name!(full_text, &'static str)
        )

然后看看这个结构的构造方式:

//首先构造一个集合,集合内部的结构与定义的结构一样:
let v:Vec<(i32,f64)> = vec![
        (1,0.5),
        (2,0.33),
        (3,0.15),
        (4,0.35)
    ];
//然后把处理好的集合,直接构造为TableIterator结构即可。
    TableIterator::new(v)

下面我们在来看一个例子,比如按照你需要的数量,来生成一个随机填充的表格,代码如下:

#[pg_extern]
fn random_values(num_rows: i32) -> 
TableIterator<'static, (name!(index, i32), name!(value, f64))> {
    TableIterator::new((1..=num_rows).map(|i| (i, rand::random::<f64>())))
}

效果如下:

使用SQL的方式来生成表格:

这个表格是可以完整使用SQL进行计算分析的,比如,生成100条随机数据,value大于0.95的,只有5条……很明显这个随机函数是正态分布的……:

好了,下面我们来看一个小案例:

返回一个序列的功能在实际工作中是经常用的,特别是做数据分析的同学,因为很多分析的结果不可能只有一条记录。

例如有些不追求数据库范式的设计,可能把数据存储成这个样子:

例如,其中values每天的平均空气质量(随机模拟数据,不要在意这些细节)

然后需求就是要对数组型字段进行计算……

当然,postgresql在9.6之后就支持json和array了,例如array可以通过ANY进行查询,也可以unnest函数进行展开:

例如我们要求2015年8月每个站点的最大值:

先要用UNNEST函数,把整个数组展开,然后再进行groupby。

但是现在问题来了,因为每个月的数据是按每天来计算的,我现在想知道,每个月,哪一天的数值最高?

要说找最高的,还是比较容易的,但是要找这是哪一天,就不太容易了,需要先求max,然后再求下标:

(叠甲:虾神对SQL不是特别熟,所以SQL代码写起来估计效率会很差,大家将就看看就是,不过:

效果如下:

那么我们如果要在pgrx里面来做这个功能,怎么做呢?相对来说就非常简单了,代码如下:

#[pg_extern]
fn get_max_value(value:Vec<i32>) ->
TableIterator<
    'static, (name!(day,i32),name!(maxvalue,i32))
>{
    let mut idx = 0;
    let mut max = 0;
    //求max的值和数组的下标
    for i in 0..value.len(){
        if max < value[i]{
            max = value[i];
            idx = i;
        }
    }
    //下标+1是因为pg的数组是从1开始的,另外我们求的是日期,也是从1开始
    TableIterator::new(vec![(idx as i32 + 1,max)])
}

效果如下:

用表格数据测试一下:

真是太残暴了……

打完收工

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

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

相关文章

您有一条群邀请消息:施耐德电气“绿色智能制造创赢计划”第四季正式启动!

4月26日&#xff0c;由工业和信息化部国际经济技术合作中心与施耐德电气共同主办的“2023绿色智能制造创赢计划”第四季正式启动 。 这一计划为拥有**技术专长与发展潜力的中小企业提供联合共创平台&#xff0c;帮助企业加速突破工业场景中的关键痛点&#xff0c;孵化和落地更…

GDB调试-从安装到使用

1、GDB简介 gdb 工具是 GNU 项目调试器&#xff0c;基于命令行。和其他的调试器一样&#xff0c;我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等&#xff0c;它是 UNIX/LINUX 操作系统下强大的程序调试工具。对于一般的Linux桌面系统(…

Nginx:worker_processes、worker_connections设置

转自&#xff1a;Nginx&#xff1a;worker_processes、worker_connections设置_worker_connections设置多少_it_zhenxiaobai的博客-CSDN博客 worker_processes与worker_connections 设置好合适大小&#xff0c;可以提升 nginx 处理性能&#xff0c;非常重要。 原作者的话&…

【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

eSIM证书要求-涉及规范SGP.22-SGP.26-2

subjectPublicKeyInfo 证书链中所有证书的subjectPublicKeyInfo中的OID都是一样的 CRL Distribution Point 证书吊销列表分发点 (CRL Distribution Point &#xff0c;简称 CDP) 是含在数字证书中的一个可以共各种应用软件自动下载的最新的 CRL 的位置信息。一个 CDP 通常出现…

egg.js + mysql + windows 踩坑全纪录

资料&#xff1a; egg.js文档&#xff08;https://www.eggjs.org/zh-CN/intro/quickstart&#xff09; 背景&#xff1a;前面的都很简单&#xff0c;按照官方文档配置即可&#xff0c;全部调通以后&#xff0c;开始接触数据库mysql 因为米有后台开发背景&#xff0c;所以需要从…

从IDC数据库安全报告,看OceanBase安全能力

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 作为数据的承载工具&#xff0c;数据库自身安全能力对于数据安全至关重要。数据库软件诞生至今&#xff0c;经过了几十年的发展和演进&#xff0c;已经成为 IT 系统中不可或缺的关键技术。但是随着…

MySQL原理(三):索引

前言 上一篇介绍了 MySQL 的逻辑架构和执行过程&#xff0c;这一篇将介绍索引相关的内容。 索引是用额外的数据结构&#xff0c;来实现快速检索目标数据的。就像字典当中的目录一样&#xff0c;用额外的空间来存储部分内容&#xff0c;从而加快检索速度。 MySQL 的逻辑架构分…

Python——PyQt5在PyCharm的配置与应用(保姆级教程)

目录 一、安装pycharm与python版本 二、升级pip与换源&#xff0c;安装PyQt5、PyQt5-tool 三、添加环境变量 四、在pycharm的外部工具里添加3个工具 4.1、添加三个插件&#xff08;重点&#xff09; 五、如何使用QtDesigner 六、如何使用pyuic5 一、安装pycharm与python版…

C语言——扫雷小游戏(递归展开版)

哈喽&#xff0c;大家好&#xff0c;上次我们已经学习了三子棋小游戏&#xff0c;今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 …

眼球追踪、HDR、VST,从代码挖掘Valve下一代VR头显

擅长爆料、挖掘线索的Brad Lynch&#xff0c;此前发布了Quest Pro等设备的线索文章引发关注。​近期&#xff0c;又公布一系列与“Valve Deckard”VR头显相关消息&#xff0c;比如支持眼球追踪、HDR、VST透视、Wi-Fi网络等等。在SteamVR 1.26.1测试版更新、Steam用户端、Gamesc…

lazada、shopee转化率低怎么办?做好这几点,让你的店铺转化率提升

如若lazada, shopee如果转化率低&#xff0c;商家需要做好以下几个方面&#xff0c;通过以下几点来提高。毕竟只有流量没有转化率&#xff0c;店铺管理不好。 1、产品类别的选择 一个好的类别本身就是一个很好的排水渠道&#xff0c;可以给我们带来大量的流量&#xff0c;高流…

数据结构与算法基础(王卓)(38):排序、全部PPT、笔记整理

首先&#xff0c;庆祝本系列完结撒花&#xff01; 对了&#xff0c;后续应该会把王卓老师所有的PPT附带笔记全部打包上传百度云 回头我把链接贴出来&#xff0c;感兴趣的朋友可以Mark一下&#xff0c;希望可以帮助到大家 如果有什么写的不对的地方&#xff0c;先给大家说声抱…

23年的软件测试前景?我卷自动化测试卷出头了,拿下22K*15薪...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试工程师主要干…

Linux一学就会——管道通信

管道通信 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&…

通过计算系统稳定性比较迭代次数

有一类差值结构可能有一行中的数字比其他行的都多&#xff0c;因此有天然的底部&#xff0c;很容易确定平均列的顺序。但是可能有的差值结构相同的底部不止一个&#xff0c;这次比较双底部差值结构迭代次数的顺序。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节…

2023年US News最佳MBA排名出炉,申请需要哪些条件?

在出国留学的大环境下&#xff0c;MBA文凭一直都非常受欢迎&#xff0c;美国商学院是中国学生热衷的留学方向&#xff0c;而针对管理者的MBA项目也受到追捧。 US News 统计了美国130个全日制MBA的毕业生起薪&#xff0c;2023年毕业生的平均工资为 $105,684&#xff0c;Top 10 …

纽扣电池/含纽扣电池商品亚马逊美国澳洲站点合规认证要求!

纽扣电池/含纽扣电池商品亚马逊美澳站点合规认证 亚马逊美国站纽扣电池&#xff08;含纽扣电池产品&#xff09;合规要求标准&#xff1a; 16CFR1700.15部分(防毒包装标准) 16CFR1700.20部分(特殊包装的检测程序) ANSI C18.3M(便携式锂原电池的安全标准) 警示标签声明要求(…

对于零基础小白来说,转行学云计算和java哪个更好一些?求推荐

对于零基础小白来说&#xff0c;转行学云计算和java哪个更好一些&#xff1f; 云计算和Java是两个不同的技术领域&#xff0c;虽然它们都与计算机网络、分布式系统和互联网应用程序等相关&#xff0c;但它们的学习重点和应用场景也不同。虽然他们都是非常有前途的IT领域&#x…

Web3中文|比特币 BRC-20 让“闪电网络”再受热议

一位幸运的矿工在上周日晚上赚取了 6.701 枚BTC&#xff08;约 200,000 美元&#xff09;的交易费用&#xff0c;超过了当前的 6.25 BTC 的区块奖励。这一极为罕见的事件说明了与 Ordinals 协议相关的区块链活动导致了用户成本的飙升。 高昂的比特币交易费用 2022年底&#xff…