Postgresql常见(花式)操作完全示例

案例说明

将Excel数据导入Postgresql,并实现常见统计(数据示例如下)

导入Excel数据到数据库

使用Navicat工具连接数据库,使用导入功能可直接导入,此处不做过多介绍,详细操作请看下图:

点击“下一步”完成导入操作(导入完成后,我们将表名命名为“eatLog”)。

 给数据表添加自增主键

导入的数据是没有主键的,这样不利于我们对数据的管理(如:在查询时,没有数据主键不能对数据进行修改等),因此我们需要扩展主键字段

添加主键字段

修改表设计,增加主键id字段(此时请勿添加主键约束)

创建自增序列

Postgresql没有像Oracle、MySQL那样的默认自增序列,因此要实现自增,可以通过自定义序列来实现

create SEQUENCE seq_eatlog_id
start with 1
increment by 1
no MINVALUE
no MAXVALUE
cache 1;

语句说明:

seq_eatlog_id:自定义的自增序列名称,根据自己需要命名

start with 1:序列从1开始

increment 1:序列自增步长为1(每次加1)

no MINVALUE:没有最小值约束

no MAXVALUE:没有最大值约束

cache 1:在数据库中始终缓存下一个序列

更新序列到数据表

update "eatLog"
set id = nextval('seq_eatlog_id')

nextval函数可获取下一个序列,可使用  select nextval('seq_eatlog_id') 来查询下一个序列。

注:调用一次nextval(),序列将被消费掉,因此不要轻易使用nextval()来查询序列,避免序列顺序混乱。

此时id已填充为自增的序列值(此时可以再修改表设计,给该表增加主键非空约束,顺手把date字段的数据类型修改为日期类型,数据会自动转换)

 

 给表主键增加自增序列

上面将主键已填充,但是在新增数据时,仍需手动添加主键,否则会提示主键为空问题。

insert into "eatLog" values('乔峰',to_date('2024-01-04','YYYY-MM-DD'),'吃拉面',null,'xiaofeng@tianlong.com');

题外话:

Postgresql的表名和字段都是区分大小写的,因此针对驼峰名称必须添加双引号进行操作,否则会提示表或字段不存在 

全大写或全小写的表名可以省略双引号

因此需要给主键id字段添加自增序列,以便后续新增数据。

alter table "eatLog" alter COLUMN id set DEFAULT nextval('seq_eatlog_id');

再次执行插入语句,即可添加成功(以后添加数据无需再管主键id字段了)。

常见日期操作

获取周

查询数据中的日期在当年第几周,并将周信息保存到数据库中,以便后续按周统计

表设计中增加“周(week)”字段

select date_part('week',date::timestamp) week from "eatLog";

将周信息更新到表中

update "eatLog"
set week = date_part('week',date::timestamp)

获取月

查询月份方式一(格式化字符方式):

select to_char(date,'MM') from "eatLog";

查询月份方式二(日期函数获取):

select date_part('month',date::timestamp) from "eatLog";

查询月份方式三(提取函数获取):

select extract(month from date) as month from "eatLog";

查询部分时段数据

select * from "eatLog" 
where date >= to_date('2024-01-05','YYYY-MM-DD')
AND date <= to_date('2024-01-08','YYYY-MM-DD')
and phone is not null

数据脱敏

姓名脱敏

使用“*”号代替姓名中除第一个字和最后一个字的所有字符,两个字的名字仅替换最后一个字。

----三字及以上姓名脱敏
update "eatLog" 
set name = concat(left(name,1),repeat('*', length(name) - 2),right(name,1)
)
where length(name) > 2;----两字姓名脱敏
update "eatLog" 
set name = concat(left(name,1),repeat('*', length(name) - 1)
)
where length(name) = 2;

concat()函数:用于拼接字符串

left()函数:用于截取字符串,指定从左截取多少位

right()函数:用于截取字符串,指定从右截取多少位

repeat()函数:用于替换字符串,指定替换多少位

手机号脱敏

保留手机号前三位和后四位,其他信息用“*”号代替

update "eatLog"
set phone = concat(left(phone,3),repeat('*',length(phone) - 7),right(phone,4)
)

注:身份证、银行卡脱敏思路相同 

 邮箱脱敏

update "eatLog"
set email = concat(left(email,1),repeat('*',position('@' in email) - 2),substring(email from position('@' in email))
)

substring()函数:截取字符串

position()函数:定位字符或字符串所在下标位置

 

数据统计

分组统计

根据周、饮食类型分组查询

select extract(week from t1.date) as week,t1.food,count(1)
from "eatLog" t1
group by extract(week from t1.date),t1.food
order by extract(week from t1.date)

行转列统计

统计所有数据

select * from crosstab('select extract(week from t1.date) as week,t1.food,count(1)
from "eatLog" t1
group by extract(week from t1.date),t1.food
order by extract(week from t1.date),t1.food','select food from "eatLog" group by food order by food'
)
as (week int,吃火锅 NUMERIC,吃拉面 NUMERIC,吃馒头 NUMERIC,吃米饭 NUMERIC,吃米线 NUMERIC,吃面条 NUMERIC
)
order by week

行转列使用crosstab(sql1,sql2)函数

参数说明:

        sql1:统计数据的语句

        sql2:行转列的列查询SQL

crosstab的sql1返回值中必须有且只有三个字段:

        第一个字段表示行ID(可由分组生成),

        第二个字段表示分组目录(即待转换列),

        第三个字段表示统计数据

as中的内容是转换的列名及列值类型,此处的列明必须完全列出,与实际数据相符,否则会报错误。

注一:

postgresql默认未安装扩展函数,因此要使用crosstab()函数,必须先启用扩展

使用命令:

CREATE EXTENSION IF NOT EXISTS tablefunc;

注二:

行转列时,sql2参数必须进行排序,若不排序,虽然能转成功,但是会发现数据可能已经混乱,postgresql在行转列时,通过as中指定顺序匹配,而非是通过字段名称匹配,所以orader by固定数据位置,很容易造成匹配错误(as中的顺序可以使用sql2执行之后确认是否一致)

 统计部分数据

select * from crosstab('select extract(week from t1.date) as week,t1.food,count(1)
from "eatLog" t1
where t1.date >= to_date(''2024-01-05'',''YYYY-MM-DD'')
AND t1.date <= to_date(''2024-01-08'',''YYYY-MM-DD'')
group by extract(week from t1.date),t1.food
order by extract(week from t1.date),t1.food','select food from "eatLog" group by food order by food'
)
as (week int,吃火锅 NUMERIC,吃拉面 NUMERIC,吃馒头 NUMERIC,吃米饭 NUMERIC,吃米线 NUMERIC,吃面条 NUMERIC
)
order by week

在crosstab的sql参数中,若已经使用了单引号('),则需要使用两个单引号('')表示一个单引号,用于转义,否则SQL执行报错

另外,SQL查询时,若表名或字段使用驼峰时,必须使用双引号修饰,否则会找不到对象(Postgresql严格区分大小写,全大写或全小写时可以省略双引号修饰)

自定义统计列

select * from crosstab('select extract(week from t1.date) as week,t1.food,count(1) food_count
from "eatLog" t1
where t1.date >= to_date(''2024-01-05'',''YYYY-MM-DD'')
AND t1.date <= to_date(''2024-01-08'',''YYYY-MM-DD'')
group by extract(week from t1.date),t1.food
order by extract(week from t1.date)',$$values('吃火锅'),('吃米饭'),('吃米线'),('吃面条')$$
)
as (week int,吃火锅 NUMERIC,吃米饭 NUMERIC,吃米线 NUMERIC,吃面条 NUMERIC
)
order by week

可通过$$values()$$来指定转哪些列,注意values()的顺序必须与as中的顺序一致

 

其他操作

计算精度问题

试想,我们的数据是统计每周的饮食统计,那每种饮食在每周占比是多少呢?

select m1.week,m1.food,m1.food_count, (select count(1) week_countfrom "eatLog" t2where t2.date >= to_date('2024-01-05','YYYY-MM-DD')AND t2.date <= to_date('2024-01-08','YYYY-MM-DD')and extract(week from t2.date) = m1.weekgroup by extract(week from t2.date)order by extract(week from t2.date)) week_count
from
(
select extract(week from t1.date) as week,t1.food,count(1) food_count
from "eatLog" t1
where t1.date >= to_date('2024-01-05','YYYY-MM-DD')
AND t1.date <= to_date('2024-01-08','YYYY-MM-DD')
group by extract(week from t1.date),t1.food
order by extract(week from t1.date)
) m1
order by m1.week,m1.food

计算占比时请注意精度问题

select m1.week,m1.food,round(m1.food_count::numeric / (select count(1) week_countfrom "eatLog" t2where t2.date >= to_date('2024-01-05','YYYY-MM-DD')AND t2.date <= to_date('2024-01-08','YYYY-MM-DD')and extract(week from t2.date) = m1.weekgroup by extract(week from t2.date)order by extract(week from t2.date))::numeric * 100,2) "rate(%)"
from
(
select extract(week from t1.date) as week,t1.food,count(1) food_count
from "eatLog" t1
where t1.date >= to_date('2024-01-05','YYYY-MM-DD')
AND t1.date <= to_date('2024-01-08','YYYY-MM-DD')
group by extract(week from t1.date),t1.food
order by extract(week from t1.date)
) m1
order by m1.week,m1.food

Postgresql在计算时默认使用int来计算,因此不会取小数,若需要保留小数,需指明参加运算的字段类型,可通过“::numeric”来指明运算字段为数字型,这样运算结果可以保留小数

要具体精确到多少位,需要使用round()函数

行转列后效果

select * from crosstab('select m1.week,m1.food,round(m1.food_count::numeric / (select count(1) week_countfrom "eatLog" t2where t2.date >= to_date(''2024-01-05'',''YYYY-MM-DD'')AND t2.date <= to_date(''2024-01-08'',''YYYY-MM-DD'')and extract(week from t2.date) = m1.weekgroup by extract(week from t2.date)order by extract(week from t2.date))::numeric * 100,2) "rate(%)"
from
(
select extract(week from t1.date) as week,t1.food,count(1) food_count
from "eatLog" t1
where t1.date >= to_date(''2024-01-05'',''YYYY-MM-DD'')
AND t1.date <= to_date(''2024-01-08'',''YYYY-MM-DD'')
group by extract(week from t1.date),t1.food
order by extract(week from t1.date)
) m1
order by m1.week,m1.food','select food from "eatLog" group by food order by food'
)
as (week int,吃火锅 NUMERIC,吃拉面 NUMERIC,吃馒头 NUMERIC,吃米饭 NUMERIC,吃米线 NUMERIC,吃面条 NUMERIC
)
order by week

以上,就是Postgresql在使用中常见操作及示例说明,希望对您有所帮助。 

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

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

相关文章

点云从入门到精通技术详解100篇-基于多传感器融合的智能汽车 环境感知(下)

目录 基于激光雷达点云的目标检测 4.1 点云神经网络检测模型 4.2 点云预处理

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多…

npx和npm有什么区别,包管理器yarn的使用方法,node的版本管理工具nvm使用方法

文章目录 一、npx介绍及使用1、npx 是什么2、npx 会把远端的包下载到本地吗?3、npx 执行完成之后&#xff0c; 下载的包是否会被删除&#xff1f;4、npx和npm的区别 二、yarn介绍及使用1、Yarn是什么&#xff1f;2、Yarn的常见场景&#xff1a;3、Yarn常用命令 三、nvm介绍及使…

vue3基础:单文件组件介绍

介绍 Vue 的单文件组件 (即 *.vue 文件&#xff0c;简称 SFC&#xff0c;全称是single file component) 是一种特殊的文件格式&#xff0c;使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。下面是一个单文件组件的示例&#xff1a; <script> export def…

Ubuntu root 远程登录失败

背景&#xff1a;设置了两个系统用户&#xff1a;root、test&#xff1b;test可以登录&#xff0c;可以使用su 命令切换root用户登录成功&#xff1b; 但是直接用root登录&#xff0c;会报错。 查看登录日志的方法&#xff1a; 需要两个远程窗口&#xff0c;在第一个远程窗口…

日志审计系统Agent项目创建——初始化数据库和日志文件(Linux版本)

1、定义和初始化函数&#xff1a; bool Init(std::string ip); 1.1、获取ip地址&#xff0c;这里的ip地址是通过makefile文件直接设定的。 bool XAgent::Init(string ip) {if (ip.empty()){cerr << "Agent::init failed! ip is empty" << endl;return…

力扣|2023华为秋招冲刺

文章目录 第一关&#xff1a;2023 年 7 月面试题挑战第二关&#xff1a;2023 年 6 月面试题挑战第三关&#xff1a;2023 年 5 月面试题挑战 第一关&#xff1a;2023 年 7 月面试题挑战 class Solution { public:void reverseWord(vector<char>& s,int l,int r){for(i…

单片机学习记录(一)

简答题 第1章 1.微处理器、微计算机、CPU、单片机、嵌入式处理器他们之间有何区别&#xff1f; 答&#xff1a;微处理器、CPU都是中央处理器的不同称谓&#xff0c;微处理器芯片本身不是计算机&#xff1b; 单片机、微计算机都是一个完整的计算机系统&#xff0c;单片机是集…

关于Python里xlwings库对Excel表格的操作(三十二)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”设置坐标轴标题文本内容】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库…

建筑钢筋表面为什么加上螺纹呢?

问题描述&#xff1a; 建筑钢筋表面为什么加上螺纹呢&#xff1f; 问题解答&#xff1a; 增加黏附力&#xff1a; 螺纹结构提供更多摩擦力&#xff0c;加强钢筋与混凝土之间的粘附&#xff0c;防止滑动或剥离&#xff0c;提高结构的稳定性和强度。 提高抗拉强度&#xff1a;…

监督学习 - 多层感知机回归(Multilayer Perceptron Regression,MLP Regression)

什么是机器学习 多层感知机回归&#xff08;Multilayer Perceptron Regression&#xff0c;MLP Regression&#xff09;是一种人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;的形式&#xff0c;用于解决回归问题。多层感知机是一种包含多个层…

《安富莱嵌入式周报》第330期:开源ECU模组,开源USB PD供电SMD回流焊,嵌入式系统开发C代码参考指南,旨在提升C语言编写的源码质量

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 BSP视频教程第29期&#xff1a;J1939协议栈CAN总线专题&#xff0c;源码框架&#xff0c;执行流程和…

使用Sqoop将数据从Hadoop导出到关系型数据库

当将数据从Hadoop导出到关系型数据库时&#xff0c;Apache Sqoop是一个非常有用的工具。Sqoop可以轻松地将大数据存储中的数据导出到常见的关系型数据库&#xff0c;如MySQL、Oracle、SQL Server等。本文将深入介绍如何使用Sqoop进行数据导出&#xff0c;并提供详细的示例代码&…

【笔记】Helm-3 主题-3 Chart Test

Chart Test Chart包含了很多一起工作的Kubernetes资源和组件。作为一个chart作者&#xff0c;您可能想写一些测试验证chart安装时是否按照预期工作。这些测试同时可以帮助chart用户理解您的chart在做什么。 test在heml chart中放在templates/目录&#xff0c;并且是一个指定了…

Python web自动化测试框架搭建(功能接口)——通用模块

1、通用模块&#xff1a; config.conf: 公共配置文件&#xff0c;配置报告、日志、截图路径&#xff0c;以及邮件相关配置 [report] reportpath E:\workspace\WebAutomation\src\functiontest\Report\2017-07-18 screen_path E:\workspace\WebAutomation\src\functiontest\R…

电脑/设备网络共享给其他设备上网

文章目录 一、概述二、设置网络共享2.1 电脑可以上网&#xff0c;通过网络共享让其他设备也可以上网2.2 手机如何使用USB数据线共享网络给电脑 一、概述 现在有如下几种情况&#xff1a; 设备本身不能上网&#xff0c;需要通过电脑上网 笔记本WIFI连热点上网&#xff0c;然后…

C#,卡特兰数(Catalan number,明安图数)的算法源代码

一、概要 卡特兰数&#xff08;英语&#xff1a;Catalan number&#xff09;&#xff0c;又称卡塔兰数、明安图数&#xff0c;是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁查理卡特兰的名字来命名。1730年左右被蒙古族数学家明安图使用于对三角函数幂…

【Git不走弯路】(一)版本管理需求分析

1. 什么是版本 在计算机中&#xff0c;版本就是备份。备份是计算机中的“后悔药”&#xff0c;可以在任何需要的时候将数据从以前的备份中原样取出。备份和快照、还原点是相似的东西。计算机词汇每年都层出不穷&#xff0c;很多词汇背后的原理却简单朴素。 2. 版本管理的必要…

运动模型非线性扩展卡尔曼跟踪融合滤波算法(Matlab仿真)

卡尔曼滤波的原理和理论在CSDN已有很多文章&#xff0c;这里不再赘述&#xff0c;仅分享个人的理解和Matlab仿真代码。 1 单目标跟踪 匀速转弯&#xff08;CTRV&#xff09;运动模型下&#xff0c;摄像头输出目标状态camera_state [x, y, theta, v]&#xff0c;雷达输出目标状…

【软件测试】学习笔记-代码级测试的基本理念与方法

通常情况下&#xff0c;代码级测试的工作都是由开发人员完成&#xff0c;但是测试框架选型、覆盖率统计工具选型、测试用例设计原则等都需要资深的测试工程师或者测试架构师参与。 为了能更好地协助开发人员做好代码级测试&#xff0c;这篇文章是根据实际工程项目中的实践&…