row_number() 、dense_rank() 、rank() 、Over、Pivot用法说明

        row_number() +1递增返回行号
  dense_rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级数量等级的排名+1
  rank() 同数量等级的数据返回相同名次,下级数量等级的排名为上级所有数据总数+1
  语法
  function_name() OVER ( [ <partition_by_clause> ] <order_by_clause> )  

  CREATE TABLE employee (depart_name varchar(10),work_no varchar(6),salary int )

  depart_name work_no     salary
  财务部    2000012000
  财务部    2000022500
  财务部    2000042500
  发展部    3000022000
  发展部    3000091800
  发展部    3000142000
  综合部    4000011800
  综合部    4000052000
  综合部    4000092500
  技术部    5000082500
  技术部    5000991800
  技术部    5001022700

  --按工资从低到高排名
  SELECT row_number() OVER (ORDER BY salary ) as id,
  dense_rank() OVER (ORDER BY salary desc) as 工资排名1,
  rank() OVER (ORDER BY salary desc) as 工资排名2,
  * FROM employee

  ID  工资排名1 工资排名2 部门名   工号   工资
  111发展部3000091800
  211综合部4000011800
  311技术部5000991800
  424发展部3000022000
  524综合部4000052000
  624发展部3000142000
  724财务部2000012000
  838财务部2000022500
  938财务部2000042500
  1038综合部4000092500
  1138技术部5000082500
  12412技术部5001022700

  --分部门按工资从低到高排名
  SELECT row_number() OVER (PARTITION BY depart_name ORDER BY salary ) as 工资排名,
  * FROM employee

  工资排名  部门名        工号    工资
  1  财务部2000012000
  2  财务部2000022500
  3  财务部2000042500
  -------------------
  1  发展部3000091800
  2  发展部3000142000
  3  发展部3000022000
  -------------------
  1  技术部5000991800
  2  技术部5000082500
  3  技术部5001022700
  -------------------
  1  综合部4000011800
  2  综合部4000052000
  3  综合部4000092500

  二  行列转换

  CREATE TABLE E_money (work_no varchar(6),moeny_type varchar(10),num int )

  work_no money_type num
  100001HKD   100
  100001HKD   200
  100001USD   300
  200020HKD   50
  200020RMB   5000
  200020USD   500
  400078HKD   80
  400078HKD   90
  400078RMB   800
  400078RMB   900
  400078USD   90
  400078USD   800

  
  --统计每个员工不同币种拥有数
  work_no 港币    美元    人民币
  10000130030050
  200020505005000
  4000781708901700

  --sql 2000写法
  select work_no,
  sum(case when moeny_type='HKD' then num else 0 end) as 港币,
  sum(case when moeny_type='USD' then num else 0 end) as 美元,
  sum(case when moeny_type='RMB' then num else 0 end) as 人民币
  from e_money
  group by work_no

  --2005新增函数
  SELECT work_no,[HKD] as 港币,[USD] as 美元,[RMB] as 人民币 FROM e_money
  PIVOT(
  SUM(num)
  FOR moeny_type IN
  ([HKD],[USD],[RMB])
  ) AS pvt

-- 客户表 CREATE TABLE customers1 ( customer_id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, age NUMBER(3), city VARCHAR2(50), segment VARCHAR2(20) CHECK(segment IN ('GOLD','SILVER','BRONZE')) ); drop table customers -- 账户表 CREATE TABLE accounts1 ( account_id NUMBER PRIMARY KEY, customer_id NUMBER NOT NULL REFERENCES customers1(customer_id), account_type VARCHAR2(20) CHECK(account_type IN ('SAVINGS','FIXED_DEPOSIT','CURRENT')), balance NUMBER(15,2) DEFAULT 0, open_date DATE DEFAULT SYSDATE, interest_rate NUMBER(5,4) ); drop table accounts -- 交易表 CREATE TABLE transactions1 ( transaction_id NUMBER PRIMARY KEY, account_id NUMBER NOT NULL REFERENCES accounts1(account_id), transaction_type VARCHAR2(10) CHECK(transaction_type IN ('DEPOSIT','WITHDRAWAL')), amount NUMBER(15,2) NOT NULL, transaction_date DATE DEFAULT SYSDATE, channel VARCHAR2(20) CHECK(channel IN ('BRANCH','ATM','ONLINE','MOBILE')) ); -- 分行表 CREATE TABLE branches1 ( branch_id NUMBER PRIMARY KEY, branch_name VARCHAR2(100), city VARCHAR2(50), region VARCHAR2(50) ); 1. PIVOT 应用 - 分行存款类型统计 要求:统计每个分行不同账户类型(SAVINGS, FIXED_DEPOSIT, CURRENT)的账户数量和总余额,结果以矩阵形式展示 2. UNPIVOT 应用 - 客户年龄分段存款分析 要求:将客户按年龄段分组(<30, 30-50, >50),统计每组的存款总额,然后使用UNPIVOT转换为行格式 3. 开窗函数 - 客户存款排名 要求:为每个城市的客户计算存款排名(使用RANK, DENSE_RANK, ROW_NUMBER),并显示排名信息 4. 聚合函数与开窗函数 - 交易分析 要求:分析每个账户的存款行为,计算: 总存款次数 最大单笔存款金额 最近一次存款日期 存款金额与账户平均存款的差异 5. 高级开窗函数 - 存款趋势分析 要求:分析每个账户的存款模式,计算: 每次存款与前一次存款的间隔天数 每次存款与前一次存款的金额差异 存款金额的移动平均值(3次移动平均) 6. PIVOT 与开窗函数结合 - 渠道存款分析 要求:按季度和渠道统计存款总额,并计算每个渠道的季度环比增长率
最新发布
06-05
-- 客户表 CREATE TABLE customers ( customer_id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, age NUMBER(3), city VARCHAR2(50), segment VARCHAR2(20) CHECK(segment IN ('GOLD','SILVER','BRONZE')) ); -- 账户表 CREATE TABLE accounts ( account_id NUMBER PRIMARY KEY, customer_id NUMBER NOT NULL REFERENCES customers(customer_id), account_type VARCHAR2(20) CHECK(account_type IN ('SAVINGS','FIXED_DEPOSIT','CURRENT')), balance NUMBER(15,2) DEFAULT 0, open_date DATE DEFAULT SYSDATE, interest_rate NUMBER(5,4) ); -- 交易表 CREATE TABLE transactions ( transaction_id NUMBER PRIMARY KEY, account_id NUMBER NOT NULL REFERENCES accounts(account_id), transaction_type VARCHAR2(10) CHECK(transaction_type IN ('DEPOSIT','WITHDRAWAL')), amount NUMBER(15,2) NOT NULL, transaction_date DATE DEFAULT SYSDATE, channel VARCHAR2(20) CHECK(channel IN ('BRANCH','ATM','ONLINE','MOBILE')) ); -- 分行表 CREATE TABLE branches ( branch_id NUMBER PRIMARY KEY, branch_name VARCHAR2(100), city VARCHAR2(50), region VARCHAR2(50) ); 1. PIVOT 应用 - 分行存款类型统计 要求:统计每个分行不同账户类型(SAVINGS, FIXED_DEPOSIT, CURRENT)的账户数量和总余额,结果以矩阵形式展示 2. UNPIVOT 应用 - 客户年龄分段存款分析 要求:将客户按年龄段分组(<30, 30-50, >50),统计每组的存款总额,然后使用UNPIVOT转换为行格式 3. 开窗函数 - 客户存款排名 要求:为每个城市的客户计算存款排名(使用RANK, DENSE_RANK, ROW_NUMBER),并显示排名信息 4. 聚合函数与开窗函数 - 交易分析 要求:分析每个账户的存款行为,计算: 总存款次数 最大单笔存款金额 最近一次存款日期 存款金额与账户平均存款的差异 5. 高级开窗函数 - 存款趋势分析 要求:分析每个账户的存款模式,计算: 每次存款与前一次存款的间隔天数 每次存款与前一次存款的金额差异 存款金额的移动平均值(3次移动平均) 6. PIVOT 与开窗函数结合 - 渠道存款分析 要求:按季度和渠道统计存款总额,并计算每个渠道的季度环比增长率
06-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值