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

不错的网站建设公司伍壹捌网站建设

不错的网站建设公司,伍壹捌网站建设,wordpress有采集功能吗,百度识图在线网页版视频链接 基本语法 窗口限定一个范围,它可以理解为满足某些条件的记录集合,窗口函数也就是在窗口范围内执行的函数。 基本语法 窗口函数有over关键字,指定函数执行的范围,可分为三部分:分组子句(partition by),排序子…

视频链接

基本语法

窗口限定一个范围,它可以理解为满足某些条件的记录集合,窗口函数也就是在窗口范围内执行的函数。
基本语法
窗口函数有over关键字,指定函数执行的范围,可分为三部分:分组子句(partition by),排序子句(order by),窗口子句(rows)
<函数名>over(partition by<分组的列>order by<排序的列>rows between <起始行>and <终止行>)

窗口函数适用于在不破坏原有表结构的基础上,新增一列

窗口的确定

分组子句(partition by)

根据分组设定静态窗口的范围。
不分组可以写成partition by null或者直接不写后面可以跟多个列,如 partition by cid,sname

注意 partition by与group by的区别
1)partition by不会压缩行数但是group by会

2)后者只能选取分组的列和聚合的列
也就是说group by 后生成的结果集与原表的行数和列数都不同

排序子句(order by)

不排序可以写成order by nul 或者直接不写asc或不写表示升序,desc表示降序
后面可以跟多个列,如 order by cid,sname

窗口子句(rows)

窗口子句的描述
1)起始行:N preceding/unbounded preceding
2)当前行:current row
3)终止行:N following/unbounded following
举例:
rows between unbounded preceding and current row 从之前所有的行到当前行
rows between 2 precedingand current row 从前面两行到当前行
rows between current row and unbounded following 从当前行到之后所有的行
rows between current row and 1following 从当前行到后面一行

注意:
排序子句后面缺少窗口子句,窗口规范默认是rows between unbounded preceding and current row
排序子句和窗口子句都缺失,窗口规范默认是 rows between unbounded preceding and unbounded following

总体流程
1)通过partition byorder by 子句确定大窗口(定义出上界unbounded preceding和下界unbounded following)
2) 通过row 子句针对每一行数据确定小窗口(滑动窗口)
3)对每行的小窗口内的数据执行函数并生成新的列

函数的分类

排序类

rank,dense rank,row number

--【排序类】
-- 按班级分组后打上序号不考虑并列
SELECT *, ROW_NUMBER() OVER (PARTITION BY cid ORDER BY score DESC) AS '不可并列排名' FROM SQL_5;-- 按班级分组后作跳跃排名考虑并列
SELECT *, RANK() OVER (PARTITION BY cid ORDER BY score DESC) AS '跳跃可并列排名' FROM SQL_5;-- 按班级分组后作连续排名考虑并列
SELECT *, DENSE_RANK() OVER (PARTITION BY cid ORDER BY score DESC) AS '连续可并列排名' FROM SQL_5;-- 合并起来对比
SELECT *,ROW_NUMBER() OVER (PARTITION BY cid ORDER BY score DESC) AS '不可并列排名',RANK() OVER (PARTITION BY cid ORDER BY score DESC) AS '跳跃可并列排名',DENSE_RANK() OVER (PARTITION BY cid ORDER BY score DESC) AS '连续可并列排名'
FROM SQL_5;

聚合类

sum, avg, count, max, min

--【聚合类】
-- 让同一班级每个学生都知道班级总分是多少
SELECT *, SUM(score) OVER (PARTITION BY cid) AS '班级总分' FROM SQL_5;
-- 或者可以写成
SELECT *, SUM(score) OVER (PARTITION BY cid ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS '班级总分' FROM SQL_5;-- 计算同一班级,每个同学和比他分数低的同学的累计总分是多少
SELECT *, SUM(score) OVER (PARTITION BY cid ORDER BY score) AS '累加分数' FROM SQL_5;
-- 或者可以写成其中rows between ... and 是规定窗口大小
SELECT *, SUM(score) OVER (PARTITION BY cid ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS '班级总分' FROM SQL_5;

跨行类

lag, lead

-- lag/lead 函数参数说明:
参数1:比较的列
参数2:偏移量
参数3:找不到的默认值-- 同一班级内,成绩比自己低一名的分数是多少
select *, lag(score, 1) over (partition by cid order by score) as '低一名的分数' from SQL_5;
-- 或者写成
select *, lag(score, 1, 0) over(partition by cid order by score) as '低一名的分数' from SQL_5;
-- 向后查询:班级内,成绩比自己高2名的分数是多少
select *, lead(score, 2) over(partition by cid order by score) as '高两名的分数' from SQL_5;

具体问题

分组内TopN查询解决方案

问题1:求出每个学生成绩最高的三条记录

(基于 groupby + order by 实现)

SELECT * FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY sname ORDER BY score DESC) AS rn FROM SQL_6
) AS temp
WHERE rn <= 3;

问题2:找出每门课程成绩都高于班级课程平均分的学生

  1. 先求出每个班级、每门课程的平均分
  2. 筛选出所有课程成绩均高于对应班级课程平均分的学生
WITH
-- 1) 计算每个班级每门课程的平均分(t1)
t1 AS (SELECT *,AVG(score) OVER (PARTITION BY cid, course) AS avgFROM SQL_6
),
-- 2) 计算学生成绩与班级平均分的差值(t2)
t2 AS (SELECT *,score - avg AS 'del'FROM t1
)-- 3) 筛选每门课都高于平均分的学生
SELECT sname 
FROM t2
GROUP BY sname
HAVING MIN(del) > 0;

问题3:求每个部门工资最高的前三名员工

-- 1. 首先对每个部门的员工工资进行排序,然后给出1 2 3 的序号
with t1 as (SELECT *, row_number() OVER(partition by dept_no ORDER BY salary DESC) as rn FROM SQL_7
)--2. 找每个部门的序号rn <= 3的
SELECT * FROM t1
WHERE rn <= 3-- 合并起来: 
select* from (select *, row_number() over (partition by dept_no order by salary desc) as rn from SQL_7) as tmp
where rn<= 3;

问题四:计算这些员工的工资占所属部门总工资的百分比

with t1 as(select *, sum(salary) over (partition by dept_no) as 'sum_sal' from SQL_7
),
t2 as (select *,round(salary*100/sum_sal,2)as 'percentage' from t1 select * from t2;

问题五:对各部门员工的工资进行从小到大排序,排名前30%为低层,30%-80%为中层,高于80%为高层,并打上标签

--1)对各部门员工的工资进行从小到大排序并排名select * from SOL_7;
with tl as(select *,row_number() over (partition by dept_no order by salary) as rn,count(empno) over (partition by dept_no) as cnt from SQL_7
),
t2 as(
select *,round(rn/cnt,2)as percent from t1SELECT *, case when percent <= 0.3 then'低层select *when percent <= 0.8 then'中层when percent <= 1 then'高层end as label from t2;

问题四:统计每年入职总数以及截至本年累计入职总人数(本年总入职人数+本年之前所有年的总入职人数之和)

每年入职总数:

select year(hire_date) as hire_year, count(empno) as cnt from SQL_7 
group by year(hire_date) 
order by hire_year ;

累计入职总人数:

with tl as(select year(hire_date) as hire_year, count(empno) as cntfrom SQL_7group by year(hire_date) order by hire_year
)
select *, sum(cnt) over (order by hire_year) as sum from t1;

连续问题

http://www.dtcms.com/a/603526.html

相关文章:

  • 做个网站多少钱 百度能查到的移动网站推广如何优化
  • YT8512收发包统计应用(已实践)
  • 微信小程序网站建设定制企业建设项目备案办法
  • 淘客网站后台怎么做微信公众号推广平台
  • 网站搭建教程视频免费商城自助建站
  • 昆山住房城乡建设局网站查询怀化订水网站
  • 沈阳微网站建设ppt模板免费下载网址
  • 头文件包不包含源文件场景
  • 网站集群建设必要性如何做团购网站中的美食地处地图功能
  • 怀化网站建设企业哈尔滨百度seo代理
  • 算法工程师的矛与盾
  • 门户网站开发工具软件字节跳动员工数量
  • 网站建设步骤及分工论文做网站需要什么语言
  • 网站建设项目流程WordPress VIP充值
  • 所有网站302跳转百度可信赖的郑州网站建设
  • 网站开发与网站建设甘肃兰州地震最新消息
  • 网站开发与推广计划书个人域名备案做企业网站
  • 重庆网站建设公司是什么意思小程序免费网站
  • 汇编语言编译器MASM | 高效编写汇编程序的工具
  • 网站设计步骤图片文字图片制作网站
  • 个人教程网站广西网站建设开发团队
  • 国内高端大气的网站设计wordpress 安装地址
  • 网站 mvc 设计网站开发图片放哪里
  • 江苏网站建设seo优化a站app
  • 自动优化网站建设wordpress 添加自定义字段
  • 深圳盐田住房和建设局网站广州企业100强
  • 网站文字怎么做超链接wordpress承载压力
  • 徐州网站建设开发企业网站建设平台的功能
  • 网站设计O2O平台佛山总代理国外商品网站
  • leetcode 2654