首页 > 数据库 >SQL经典用法:开窗函数之LEAD() OVER()和ROW_NUMBER() OVER()

SQL经典用法:开窗函数之LEAD() OVER()和ROW_NUMBER() OVER()

时间:2022-09-03 15:24:05浏览次数:73  
标签:shop LEAD OVER month dz 3000 SQL 2019 select

案例需求:求哪些店铺的电子类产品连续3个月增长

shop  month  dz  fz  sp

a,2019-01,3000,5000,2000

a,2019-02,6000,4000,3000

b,2019-01,3000,5000,2000

b,2019-02,6000,4000,3000

b,2019-03,3000,3500,3000

b,2019-04,3200,3300,2500

b,2019-05,4000,3000,3000

a,2019-03,3200,3500,3000

a,2019-04,3600,3000,3300

a,2019-05,3900,3500,4000

c,2019-01,3200,3500,3000

c,2019-02,3330,2900,3000

c,2019-03,3360,3200,3100

c,2019-04,3500,3100,2800

第一步:查找出每一个店铺电子类产品下个月的销量:LEAD()  OVER()

--按照店铺分组,月份升序排序

--假设已加载数据建表,表名DEMO_SALE

select  shop,

    month,

    dz,

    lead(dz,1,null)  over(partition by shop oreder by month)  as next_dz   --lead()参数1:目标字段;参数2:步长(是取下1个还是下2个);参数3:取不到给NULL

from demo_sale

第二步:用下月销量-当前月销量>0标记为1否则标记为0,我们要取标记为1的条件过滤

  select   shop,month

  from 

  (select    shop,

      month,

      case when  (next_dz - dz) > 0 then 1 else 0 end as  inc_flag

  from 

  (select  shop,

      month,

      dz,

      lead(dz,1,null)  over(partition by shop oreder by month)  as next_dz   

   from demo_sale

  )  t

  ) t2

  where t2.inc_flag =  1

--第三步:求连续3个月增长的店铺:ROW_NUMBER() 

  select  shop,substr(month,6,2) - rn  as inc2_flag   --截取月份-排序值,如果值相等就是连续增长的

  from 

  (select  shop,month,row_number() over(partition by shop  order by month )  as rn

  from 

  (select   shop,month

  from 

  (select    shop,

      month,

      case when  (next_dz - dz) > 0 then 1 else 0 end as  inc_flag

  from 

  (select  shop,

      month,

      dz,

      lead(dz,1,null)  over(partition by shop oreder by month)  as next_dz   

   from demo_sale

  )  t

  ) t2

  where t2.inc_flag =  1

  ) t3

  ) t4

--第四步:按照shop、inc2_flag聚合group by 数量>=3的店铺就是符合条件的,注意去重。

  select  distinct t5.shop

  from 

  (select  shop,substr(month,6,2) - rn  as inc2_flag   --截取月份-排序值,如果值相等就是连续增长的

  from 

  (select  shop,month,row_number() over(partition by shop  order by month )  as rn

  from 

  (select   shop,month

  from 

  (select    shop,

      month,

      case when  (next_dz - dz) > 0 then 1 else 0 end as  inc_flag

  from 

  (select  shop,

      month,

      dz,

      lead(dz,1,null)  over(partition by shop oreder by month)  as next_dz   

   from demo_sale

  )  t

  ) t2

  where t2.inc_flag =  1

  ) t3

  ) t4

  ) t5  

  group by  t5.shop.t5.inc2_flag 

  having count(1)>=3

搜索

复制

标签:shop,LEAD,OVER,month,dz,3000,SQL,2019,select
From: https://www.cnblogs.com/db-record/p/16652653.html

相关文章

  • Docker基础知识 (8) - 使用 Docker 部署 SpringBoot + MariaDB(MySQL)项目
    本文在“ Docker基础知识(7)-使用Docker部署SpringBoot项目”里的SpringbootWebDocker项目的基础上,添加JDBC、MariaDB和MyBatis相关依赖包和数据库操作代......
  • PostgreSQL-schema
    数据库包含一个或多个命名模式,这些模式又包含表。模式还包含其他类型的命名对象,包括数据类型、函数和运算符。相同的对象名称可以在不同的模式中使用而不会发生冲突;例如,sch......
  • overlay与underlay通信总结
    一、overlay简介1、VxLAN:VxLAN全称是VirtualeXtensibleLocalAreaNetwork(虚拟扩展本地局域网),主要有Cisco推出,vxlan是一个VLAN的扩展协议,是由IETF定义的NVO3(Netw......
  • PostfreSQL-行安全策略
    除了通过GRANT提供的SQL标准权限系统之外,表还可以具有行安全策略,这些策略基于每个用户来限制正常查询可以返回哪些行,或者可以通过数据修改命令插入、更新或删除哪些行......
  • django中操作mysql数据库
    1.准备工作(django连接数据库)1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项DATABASES={'default':{'ENGINE':'django.d......
  • SQL 错误 [1062] [23000]: Duplicate entry 'xxxx' for key 'xxxx'
    异常内容SQL错误[1062][23000]:Duplicateentry'xxxx'forkey'xxxx'分析异常如果报错内容如上所示,原因该表有一列唯一索引或者多列添加了联合唯一索引解决方案......
  • MySQL数据库如何线上修改表结构
    一、MDL元数据锁在修改表结构之前,先来看下可能存在的问题。1、什么是MDL锁MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式......
  • Windows10系统MySQL5.7升级到8.0
    转自:https://www.freesion.com/article/8785691339/记录MySQL5.7升级到8.0,卸载安装等解决方案1.停止MySQL服务2.卸载MySQL相关的程序step1:本次是win10系统环境;......
  • java mysql截取所需数据
    mysql截取数据:例:截取门铺名称,门铺名称长度不确定{"进店日期":"2022-09-01","电话":"1********25","姓名":"张三","单号":"90817","门铺":"吴滨路店","消费金额":"......
  • PostgreSQL-更改表
    当您创建一个表并意识到您犯了一个错误,或者应用程序的需求发生变化时,您可以删除该表并重新创建它。但是,如果表已经被数据填充,或者表被其他数据库对象引用(例如外键约束),这不......