当前位置: 首页 > news >正文

PGSQL基本使用

PGSQL基本使用

文章目录

  • PGSQL基本使用
  • 日期转换
    • 长度不够补数
    • 获取上下行
    • 取连续的开始和结束的值


日期转换

格式说明
YYYY
MM
DD
hh2424小时制
mi分钟
ss
-- 日期字符串转指定日期字符串
-- 20250101123000 转为 2025-01-01 12:30:00
select to_char(to_timestamp('20250101123000','YYYYMMDDhh24miss'),'YYYY-MM-DD hh24:mi:ss') as t;

长度不够补数

不足前面补数

-- 得到字符串 '09300000'
select lpad(cast(9300000 as text),8,'0') as t;

不足前面补数

-- 得到字符串 '15300000'
select lpad(cast(153000 as text),8,'0') as t;

获取上下行

获取上一行

-- 第一行 pre_name 为 null
 select *,
 	lag(name) over ( order by rn) as pre_name
 from table

-- 第一行 pre_name 为 ''
--说明: 1,第一行, '' 为第一行的值
 select *,
 	lag(name,1,'') over ( order by rn) as pre_name
 from table

获取下一行

-- 最后一行 pre_name 为 null
 select *,
 	lead(name) over ( order by rn) as pre_name
 from table

-- 第一行 pre_name 为 ''
--说明: 1,最后一行, '' 为最后一行的值
 select *,
 	lead(name,1,'') over ( order by rn) as pre_name
 from table

取连续的开始和结束的值

同一个账户,订单编号需要去除,5,9 。计算订单编号连续

-- 基础数据
with base as (
 select  1 as order_num, 'A01' as acct_id
 union all 
 select  2 as order_num, 'A01' as acct_id
 union all 
 select  3 as order_num, 'A02' as acct_id
 union all 
 select  4 as order_num, 'A02' as acct_id
 union all 
 select  5 as order_num, 'A02' as acct_id
 union all 
 select  6 as order_num, 'A02' as acct_id
 union all 
 select  7 as order_num, 'A01' as acct_id
 union all 
 select  8 as order_num, 'A01' as acct_id
 union all 
 select  9 as order_num, 'A01' as acct_id
 union all 
 select  10 as order_num, 'A01' as acct_id
 union all 
 select  11 as order_num, 'A01' as acct_id
 ),
 -- 根据acct_id分组,根据order_num排序
base_order as (
 select *, 
 row_number() over (partition by acct_id order by order_num) as rn 
 from base
),
-- 获取上下行的rn
-- lag(rn,1,null) 表示第一行的 rn值为空
-- lead(rn,1,null) 表示最后一行的 rn值为空
base_rn as (
select *,
  lag(rn,1,null) over (partition by acct_id order by order_num) as pre_rn,
  lead(rn,1,null) over (partition by acct_id order by order_num) as next_rn
from base_order
where order_num != 5 and order_num != 9
),
-- 计算acct_id连续的 order_num
base_link as (
select *,
  case when pre_rn is null or pre_rn + 1 != rn then  order_num else null end as start_order_num, /**连续的开始*/
  case when next_rn is null or next_rn -1 != rn then order_num else null end as end_order_num, /**连续的结束*/
  sum(case when pre_rn is null or pre_rn + 1 != rn then 1 else 0 end) over (partition by acct_id order by order_num) as link_cnt /**连续的分为一组*/
from base_rn
)
-- 获取连续的开始订单编号和对应的结束订单编号
select max(start_order_num) as start_order_num,
 max(end_order_num) as end_order_num, acct_id
from base_link
group by acct_id, link_cnt

得到结果

start_order_numend_order_numacct_id
12A01
34A02
66A02
78A01
1011A01

相关文章:

  • 深圳南柯电子|净水器EMC测试整改:水质安全与电磁兼容性的双赢
  • Word文档标题关联图片提取工具实现原理
  • React学习笔记15
  • MySQL行列转化
  • Vision Mamba论文精读笔记
  • 基于Redis实现限流的几种方式
  • MySQL 连接的使用
  • 嵌入式Zephyr RTOS面试题及参考答案
  • 【原创】springboot+vue校园外卖订餐网系统设计与实现
  • Kubeflow 2025 全栈式机器学习平台部署指南(云原生+量子混合计算)
  • 【Python办公自动化】—Excel中相同编号自动添加-1-2-3...
  • Linux--git
  • python学习笔记-mysql数据库操作
  • C语言刷题第三章(上)
  • Windows 系统下安装 RabbitMQ 的详细指南
  • word甲烷一键下标——宏
  • Echarts 柱状或折线或其他多数据图表自动向右滚动
  • centos没有ll
  • 【vue+excel】导出excel(目前是可以导出两个sheet)
  • dify+mysql的诗词助手
  • 昆明做百度网站电话号码/seo和sem的区别
  • 怎么自己在家做网站/成都百度推广开户公司
  • 滨江区住房和城乡建设局网站/郑州网站优化顾问
  • 如何在国外网站做翻译兼职/网站排名费用
  • 网站开发合同知识产权/seo网站关键字优化
  • 用vs2010做网站并连数据库/百度营销登录