前言

了解postgresql

Python连接gp

记录postgresql一些函数和方法(持续更新)

①:int类型时间转time类型时间

②:合并两列值

③:取最近N个月数据

④:按指定字符串或者符号切割

⑤:字符串切割

⑥:寻找近N个月的数据

⑦:找出表中含有小数的记录

⑧:判断某字段是否在一张表中存在

⑨:判断表是否存在

⑩:模糊匹配多个项


前言

最近也是在做项目,没有什么时间更新。今天抽空来更新一篇在项目中使用的postgresql一些相关的知识。

了解postgresql

需求:千百万数据存储在Greenplum中,需要使用Python来对gp进行读写,其中包含各种字段处理及拼接,都是使用gp函数解决的。

Python连接gp

这里使用了Python的一个包Psycopg2       控制台直接下载: pip install psycopg2

import psycopg2
#连接数据库读取数据
def gp_concat(sql):conn = psycopg2.connect(dbname="初始化库名",user="用户",password="密码",host="主机地址",port="端口号")cur = conn.cursor()try:cur.execute(sql)    #执行传过来的sqlres = cur.fetchall()col = [item[0] for item in cur.description]return res,col     #返回data和columnsexcept Exception as ex:print(ex)finally:conn.close()

调用连接函数并执行sql,返回数据后进行dataframe操作,以便后期对数据处理

sql = '''select *from xxx'''
res,col = gp_concat(sql)
all_ip = pd.DataFrame(res,columns=col)
print(all_ip)

==========================================我是分割线===========================================

记录postgresql一些函数和方法(持续更新)

①:int类型时间转time类型时间

有这样一个场景,数据中有一列时间字段,但是值是整形像:01012、161555、51233等等。不用怀疑这确实是时间!所以我们需要把整形的这些值转换成time类型。

涉及函数或方法:lpad()    rpad()

示例如下:

--  函数类型
--  LPAD(str,len,padstr)--  解释
--  lapd(t1,t2,t3)    当t1不满t2位数时,左补0,让其达到t2位长度为止
--  rapd(t1,t2,t3)    当t1不满t2位数时,右补0,让其达到t2位长度为止select lpad('01012', 6, '0')::time    --00:10:12
select rpad('01012', 6, '0')::time    --01:01:20

②:合并两列值

有这样一个场景,数据中有两列值,分别是日期列(2021-05-21)和时间列(17:05:44)。需求是把这两列值一 一拼接。组成一个新列(2021-05-21 17:05:44)。

涉及函数或方法:||

示例如下:

--  函数类型
--  (type text || type text)--  解释
--  ( left || right )    将left和right值拼接
--  注意日期和时间中有空格select (2021-05-21 || ' ' || rpad('170544', 6, '0')::time)  --2021-05-21 17:05:44

③:取最近N个月数据

有这样一个场景,经过上两步的处理,我们现在已经得到了完整日期时间。需求是找到近1个月、2个月、3个月、半年、一年的数据。

涉及函数或方法:now() - interval 'N个月 month'

示例如下:

--  解释
--  now() - interval 'N month'   now()获取当前日期时间 - N个月,得到N个月之前的日期时间select now() - interval '3 month'  -- now() = 2021-05-21 17:05:44 、 interval '3 month' = 0000-03-00 00:00:00
--  可以理解为  2021-05-21 17:05:44  -  0000-03-00 00:00:00 --  之后我们可以拿已有的日期时间来判断是否大于等于N个月之前的日期时间,得到想要的数据。
select *
from date_time >= (now() - interval '3 month')

④:按指定字符串或者符号切割

有这样一个场景,数据中有一个字段存储 120.110.119.000##1a-2b-5c-1d 这些值,这是包含了ip,mac信息,不过是用两个#连接起来的。需求是单独把ip(120.110.119.000)取出来。

涉及函数或方法:split_part()

示例如下:

--  函数接收类型
--  split_part(string text, delimiter text2, field int)--  解释
--  split_part(t1, t2, t3)   使用分隔符t2,来切割t1,最终取t3的值 (会以t2为分隔符一分为二)select split_part('120.110.119.000##1a-2b-5c-1d', '##', 1)    -- 120.110.119.000
select split_part('120.110.119.000##1a-2b-5c-1d', '##', 2)    -- 1a-2b-5c-1d

⑤:字符串切割

有这样一个场景,需要将某列值切割出来几位数。如:将2021-05-21 17:05:44中的日期或时间切出来,也当然可以使用split_part()以空格切割取第一个。不过里介绍另一个函数,所以请忽略掉上个函数!

涉及函数或方法:substring()

示例如下:

--  函数接收类型
--  substring(text , int , int)--  解释
--  SUBSTRING(t1 , t2 , t3)  将t1切割,从t2的位置开始切t3单位长度 (空格也算一个单位长度)select SUBSTRING('2021-05-21 17:21:44',1,10)  -- 2021-05-21
select SUBSTRING('2021-05-21 17:21:44',12,8)  -- 17:21:44

⑥:寻找近N个月的数据

有这样一个场景,现有一张大表,里面有某年的全量数据。现需求是找到最近N个月的数据,拿出来进行分析计算。

涉及函数或方法:now() - interval N month'

示例如下:

-- 函数接收类型    N : int,float
-- select now() - interval 'N month' -- 解释
-- select now() - interval 'N month'    从当前时间now() - 近N个月的区间范围select now() - interval '1 month'  --now : 2021-07-26    result :2021-06-26
select now() - interval '1.2 month'  --now : 2021-07-26    result :2021-06-20

⑦:找出表中含有小数的记录

有这样一个场景,现有一个trade_money字段,代表为交易金额。现需求是筛选出交易金额带小数的记录。虽然sql没有直接查找小数的方法,但是我们可以利用一些函数的返回值来逆向筛选判断,从而达到目的。

涉及函数或方法:split_part()

示例如下:

--  函数接收类型
--  split_part(string text, delimiter text2, field int)--  解释
--  split_part(t1, t2, t3)   使用分隔符t2,来切割t1,最终取t3的值 (会以t2为分隔符一分为二)-- 示例:
select split_part("100.52"::text ,'.',2)::int  --result : 52
select split_part("100"::text ,'.',2)::int  --result : 0-- 我们不难发现,如果交易金额为小数的话,我们利用split_part函数使用小数点进行分割,最后取出第二位(也就是小数部分),接着我们可以判断 > 0。这样我们就可以筛选出小数的记录了。-- 完整sql如下:
select trade_moeny
from test_table
where split_part("trade_money"::text ,'.',2)::int > 0

⑧:判断某字段是否在一张表中存在

有这样一个场景,需要对一张表中的一个字段进行聚合计算。众所周知如果这个字段不存在,计算是会报错,为了防止这一错误发生我们首先需要进行判断这个字段是否存在。

涉及函数或方法:if()

示例如下:

-- 使用方法
-- SELECT COUNT(*) cnt
-- FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名'
-- AND COLUMN_NAME = '字段名'  --判断字段数量是不足为0--  解释
--  以上sql填入表名、字段名,返回结果cnt 。如果此字段存在此表,则返回1,否则返回0。 -- 示例1:
SELECT COUNT(*) cnt
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'test_table' AND COLUMN_NAME = 'trade_moeny'     --ct1  : 1-- 示例2:
SELECT COUNT(*) cnt
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'test_table' AND COLUMN_NAME = 'sadffffffff'     --ct1  : 0-- 得到cnt后,我们可以利用if来判断,返回0时我们不进行聚合,返回1我们进行聚合。
-- 完整sql如下
if(SELECT COUNT(*) AS cnt FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名' AND COLUMN_NAME = '字段名'
) > 0

⑨:判断表是否存在

有这样一个场景,现有一批数据,需要插入到一张表中。需求是插入的时候判断表是否存在,不存在则不予插入。

涉及函数或方法:if()

示例如下:

-- 使用方法
-- SELECT COUNT(1) cnt
-- FROM pg_class c LEFT JOIN pg_namespace n ON
-- (n.oid = c.relnamespace) WHERE n.nspname = 'open' AND c.relname = '表名'--  解释
--  以上sql填入表名,返回结果cnt 。如果存在此表,则返回1,否则返回0。 -- 示例1:
SELECT COUNT(1) cnt
FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname = 'open' AND c.relname = 'test_table'     --ct1  : 1-- 示例2:
SELECT COUNT(1) cnt
FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname = 'open' AND c.relname = 'table'          --ct1  : 0-- 得到cnt后,我们可以利用if来判断,返回0时我们不进行插入,返回1我们进行插入。
-- 完整sql如下
if(SELECT COUNT(1) cnt FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname = 'open' AND c.relname = 'table'
) > 0

⑩:模糊匹配多个项

有这样一个场景,现有一批数据,需要模糊匹配多个项,以达到多种目的的筛选。

涉及函数或方法:like any( array['x1','x2'] )

示例如下:

-- like any( array['%x1%','%x2%'] )    模糊匹配前尾模糊匹配x1、x2select *
from test_table
where 字段 like any( array['%123456789%','%987654321%'] )

未完待续!!!

Python连接Greenplum及常用gp函数和方法(持续更新)相关推荐

  1. 人大金仓常用日期函数总结(持续更新中)

    1.获取当前时间.当前日期.当前时间戳 SELECT CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP 2.天数加减 -- 昨天 SELECT CURRENT ...

  2. 【JS教程】100+常用JS函数(方法)

    为什么80%的码农都做不了架构师?>>>    100+常用JS函数(方法) 1. document.write("");为 输出语句 2. JS中的注释为// ...

  3. 达梦数据库操作记录_达梦数据库常用功能及命令记录 -- 持续更新

    达梦数据库常用功能及命令记录 -- 持续更新 达梦数据库常用功能及命令记录 达梦数据库语句的使用总体来说跟 oracle 很接近的, 这篇文章主要是把常用的情况和语句做了记录, 并且后续还会不断的持续 ...

  4. adb 输入回车命令_Android超级终端(Adb Shell)常用命令、命令大全-持续更新 | 何连超的博客小站...

    Android超级终端(Adb Shell)常用命令.命令大全-持续更新 超级终端(手机端操作)与AdbShell(电脑端操作)使用的Shell命令(即Linux shell命令,类似Dos命令)是相 ...

  5. 自己常用的VScode snippet(持续更新)

    自己常用的VScode snippet(持续更新) 作者:吴业飞 时间:2018年12月4日 在VScode里编辑自己的代码段(snippet),Ctrl + Shift + p,输入snippet, ...

  6. 【软件开发】Eclipse的常用快捷键汇总,将持续更新!

    Eclipse的常用快捷键汇总,将持续更新! 1. 注释代码 & 取消注释代码:[Ctrl] + [/] 2. 放大字体:[Ctrl] + [+] 3. 缩小字体:[Ctrl] + [-] 4 ...

  7. Python连接维特智能角度传感器JY61/JY901的方法

    文章目录 1. 准备工具 2. 环境安装 3.硬件连接 4. 运行代码 5.运行结果 1. 准备工具 python 3.9.1安装包 三合一USB转串口模块 JY61或JY901姿态角度传感器模块 示 ...

  8. python双循环zip_Python 并行遍历zip()函数使用方法

    今天我们要讲主题是python并行遍历zip()函数使用方法.在讲range()函数使用方法时我们知道了,range()可以在for循环中是以非完备的方式遍历序列,那么zip()并行遍历又是怎么工作的 ...

  9. python删库_python常用删除库的方法

    本文记于初学py的时候,两年后补发. python常用库的安装方法一般有几种,比如: 1.编译过的exe包,直接无脑下一步就可以了. 2.pip install 库名,快速安装.自动匹配最新版本. 3 ...

最新文章

  1. [经典算法] 八枚硬币
  2. 机器学习之--梯度下降和最小二乘法算线性回归
  3. P11 非线性系统-《Matlab/Simulink与控制系统仿真》程序指令总结
  4. 表单元素对齐问题解决方案
  5. phpcmsV9 邮箱注册:邮箱验证(不改代码、含演示截图) - 配置篇
  6. 矩池云安装报E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unavailable)
  7. 云原生是什么?它从哪里来?又到哪里去?
  8. 国密算法-商密认证-硬件加密-同方TF32A09-32位高速加密芯片
  9. js中(function(){…})()立即执行函数写法理解
  10. android 各类开源项目整理 包括 个性化控件 工具库 完整优秀项目
  11. SPSS决策树和神经网络
  12. 对抗生成网络(Generative Adversarial Network)
  13. 各位想不想知道,360的保镖,在保护什么?
  14. 如何获取任意小程序的AppId和页面路径?
  15. If you want to be loved, be lovable.
  16. 远程桌面登录提示存储空间不足
  17. 平板作为主机扩展屏的实现
  18. 数字IC设计随笔之一(Verdi自动添加波形脚本应用)
  19. 基于Java毕业设计新闻推送系统源码+系统+mysql+lw文档+部署软件
  20. Python采集剧本杀店家数据信息,做可视化演示

热门文章

  1. deqin -学习爬虫
  2. 1904年 圣路易斯 第三届奥运会
  3. MySQL去重并计数
  4. 小白量化学习(2)自创指标设计
  5. [FML]学习笔记三 Rademacher Complexity
  6. 广东移动:各技术岗简介——FML
  7. 对于DOM操作你了解多少(手风琴+选字游戏)
  8. 淘宝产品描述信息 采集产品描述信息时显示为加载中
  9. 尝试在数据库 7 中提取逻辑页 (1:3790083) 失败。该逻辑页属于分配单元 720575940
  10. ParserError: Error tokenizing data. C error: EOF inside string starting at row 917