科普一下开窗函数之row_number()

瞎说的,非科普贴,就是给大家分享个小例子,希望给有类似需求的童鞋提供一些思路。

需求场景

有父表A和子表B,需要根据指定规则生成一个经过处理的结果集

子表B中需要增加一个虚拟序号列(原来没有),且是以某个时间字段排序后的序号
虚拟序号的长度为三位固定字符串,不足三位时前面补0

coding

--创建父表
create table t_parent(
c_id char(32),
c_name varchar(300)
);

--创建子表
create table t_child(
c_id char(32),
c_pid char(32),
c_name varchar(300),
dt_createtime timestamp
);

--插入父表记录
insert into t_parent values ('827962f4d9e711e99433005056ac0cb7', '父一');
insert into t_parent values ('827973acd9e711e99434005056ac0cb7', '父二');

--select * from t_parent;
--插入子表记录
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827962f4d9e711e99433005056ac0cb7', '父一子一', '2019-01-01');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827962f4d9e711e99433005056ac0cb7', '父一子二', '2019-01-02');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827962f4d9e711e99433005056ac0cb7', '父一子三', '2019-01-09');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827962f4d9e711e99433005056ac0cb7', '父一子四', '2019-01-07');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827962f4d9e711e99433005056ac0cb7', '父一子五', '2019-01-05');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827973acd9e711e99434005056ac0cb7', '父二子一', '2019-01-09');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827973acd9e711e99434005056ac0cb7', '父二子二', '2019-01-02');
insert into t_child values (replace(public.uuid_generate_v1()::Text, '-', ''), '827973acd9e711e99434005056ac0cb7', '父二子三', '2019-01-04');

--select * from t_child;
--使用开窗函数查询结果(以父表记录分组,相同父表记录的子表记录独立编号,且以子表的时间字段排序)
select row_number() over(partition by tp.c_id order by tc.dt_createtime), * from t_parent tp inner join t_child tc on tp.c_id = tc.c_pid;
--进阶版-自动补全编号(其实写个函数更合适,sql不要写的太复杂,否则我都不想看) PS:不支持超过999的哦
select case when (rn < 10) then ('00' || rn) when (rn > 9 and rn < 100) then ('0' || rn) else rn::text end, * from (select row_number() over(partition by tp.c_id order by tc.dt_createtime) rn, tp.c_id c_pid, tp.c_name c_pname, tc.c_id, tc.c_name, tc.dt_createtime 
from t_parent tp inner join t_child tc on tp.c_id = tc.c_pid)
res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值