sql日常积累

本文展示了SQL中的一些高级操作,包括如何进行行转列,查询重复数据,实现分页查询,更新表字段,插入数据,使用LAG和LEAD函数进行偏移处理,列表agg进行分组拼接,以及NOTEXISTS子句和各种开窗函数的用法,如row_number(),rank(),dense_rank()等。

1、行转列

with temp as(
select '四川省' nation ,'成都市' 第一,'绵阳市' 第二,'德阳市' 第三,'宜宾市' 第四  from dual union all
select '湖北省' nation ,'武汉市' 第一,'宜昌市' 第二,'襄阳市' 第三,'' 第四   from dual
)
select nation,name,title from
temp
unpivot
(name for title in (第一,第二,第三,第四))t
; --unpivot(自定义列名/*列的值*/ for 自定义列名/*列名*/ in(列名))

2、查询重复数据

select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

3、分页查询

SELECT * FROM (

  SELECT A.*, rownum r FROM 表名 A

  WHERE rownum <= 10 

) B WHERE r > 0

4、更新table_a表aa字段更新为table_b表bb字段

update table_a  a

/* 更新a表col字段值等于b表中coll字段的值,其中a.id=b.id */

      set  aa=(select bb from table_b b where a.id=b.id and bb is not null) 

/* 只更新a.id再b表中存在的记录 ,如果不加该条件会有问题*/

where exists (select 1 from table_b b where a.id=b.id)
;

5、insert b表数据到a表

insert into a (select * from b)

6、偏移函数使用

--lag向上偏移,lead向下偏移
select machinename, eventtime, lag(eventtime, 1, null) over(partition by machinename order by eventtime),
  lead(eventtime, 1, null) over(partition by machinename order by eventtime)  
from machinehistory mh
where eventname = 'CHGEQPSTATE'

执行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6d33d8bd913a476c9da735603ffcdb83.png
emmm,其实一直不太理解为啥lag是向上偏移,lead是向上偏移,明明觉得它两反了呢(如图红色箭头)?欢迎小伙伴们给我开导开导

7、分组拼接 --listagg(字段,‘拼接字符’)

select  姓名, listagg(手机号,',') within group (order by 姓名) 手机号
  from PersonInFo
  where 姓名='李四'
  group by 姓名;

8、not exists

select 列名 from 表名 where not exists (子查询);

9、开窗函数的使用

语法:函数 + over(partition by <分组用列> order by <排序用列>)

  1. 聚合函数
    sum() 、count() 、min() 、max() 、 avg()
  2. 排序开窗函数
    ① row_number() – 相同值排名顺延,返回结果1、2、3、4
    ② rank() – 相同结果排名相同,后续排名不连续,返回结果为 1、2、2、4
    ③ dense_rank() – 相同结果排名相同,后续排名顺延,返回结果为 1、2、2、3
    ④ ntile(n) – 分组排名,将数据分为n组并返回对应组号1、2…n
  3. 其他函数
    ① lag(字段名,n,0) – 移位开窗函数,表示返回向上第n行指定字段对应数据。其中n代表向上偏移n行,0代表若偏移行数超出表范围则返回0也可以改成其他值,若不写则默认null
    ② lead(字段名,n,0) – 移位开窗函数,与lag()相反,表示返回向下第n行指定字段对应数据
    ③ first_value() – 取分组内排序后,截止到当前行,第一个值
    ④ last_value() – 取分组内排序后,截止到当前行,最后一个值

开窗函数不会互相干扰,在同一个查询语句中可以同时使用多个开窗函数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值