![](https://img-blog.csdnimg.cn/202103180857066.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
SQL案例
文章平均质量分 50
以实战为例介绍SQL的使用
ShenLiang2025
『沈亮』_聚焦数据科学领域的技术研究与实践,擅长数据库开发、ETL、数据仓库、大数据、数据分析、机器学习、基础数学等方向。
展开
-
SQL Tips汇集及常见问题
SQL Tips汇集及常见问题原创 2023-05-18 11:23:11 · 345 阅读 · 0 评论 -
SUM累计窗口统计的两种实现方法示例
SUM累计窗口函数的使用案例原创 2023-02-09 18:10:06 · 291 阅读 · 0 评论 -
SQL 分组使用案例
SQL分组函数理解与使用原创 2022-01-13 08:55:34 · 650 阅读 · 1 评论 -
查询每个班级排名第三的学生
查询每个班级排名第三的学生原创 2021-12-28 10:08:49 · 1644 阅读 · 1 评论 -
SQL笛卡尔积结合前后行数据的统计案例
SQL前后3天统计分析原创 2021-12-14 14:20:03 · 1094 阅读 · 0 评论 -
SQL LEFT JOIN与IN使用案例说明
SQL LEFT JOIN与IN使用案例说明原创 2021-12-14 09:15:00 · 1645 阅读 · 0 评论 -
一条mysql分组查询的问题分析
Mysql数据分组问题分析原创 2021-12-08 10:00:00 · 428 阅读 · 0 评论 -
如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
SQL按内容拆分字段原创 2021-12-06 10:00:00 · 11315 阅读 · 0 评论 -
SQL按照年月员工状态统计出勤情况
SQL按照年月员工状态统计出勤情况原创 2021-11-23 10:49:06 · 2715 阅读 · 1 评论 -
SQL计算留存率
用SQL计算用户的留存率需求描述有用户活跃表dws_user_active_t,它的字段有:ds '操作日期',device '设备类型' 1 手机 2 PAD 3 浏览器,user_id '用户id',active_score '活跃度'需要计算出用户留存率(公式见下):留存率=(昨天活跃用户∩今天活跃用户)/昨天活跃用户。示例数据问题分析留存率的计算主要涉及到一个时间参数,而与之对比的时间则是昨天,简单的说即取昨天的用户里仍然在今天活跃的比率。S...原创 2021-10-13 15:09:24 · 1207 阅读 · 0 评论 -
SQL语句的执行顺序的理解
标准SQL语句的执行顺序的理解SQL语句执行顺序的解读(7) SELECT (8) DISTINCT <select_list>(1) FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4) WHERE <where_condition>(5) GROUP BY原创 2021-10-12 08:47:43 · 285 阅读 · 0 评论 -
SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲
SQL 聚合函数与GROUP BY NULL的关系及ALL的使用说明需求说明有如下一道SQL题,网友咨询:1 为啥正确答案是第二项?2 聚合函数是否一定要跟GROUP BY PARTITION BY?问题解答/*# 0 关于问题找出GDP比亚洲里任意一个国家都多的所有国家。注:亚洲的一些国家的GDP可能是NULL值。#1 关于答案的分析:条件1:Africa(some countries may hava NULL gdp vlulues),亚洲的一些国家的..原创 2021-09-22 09:47:31 · 2375 阅读 · 0 评论 -
处理字符串_14_SQL处理IN和合并后字符串案例详解
SQL 处理IN和合并字符串需求概述查询以逗号隔开的员工编号列表数据里对应的员工编号、员工名称、工资、部门编号。如传来的员工列表是'7654,7698,7782,7788'。问题分析首先SQL是不能直接处理合并后的字符串的数据,但是如果把合并的字符串转成单个的值并组成集合是可以的。SQL代码-- 方法一 通过构造自增表结合substring_index拆分字符串。select empno, ename, sal, deptnofrom empwhere empno in(原创 2021-09-14 16:13:01 · 425 阅读 · 0 评论 -
SQL Server pivot行列转换案例分析
通过Pivot进行行列转换需求描述需求:如果我们对订单表(Sales.Orders)里的客户编号(cust_id)以不同的货船编号(shipperid)为列,其对应的费用(freight)求和为值进行转置。解决方法:这里需要用PIVOT关键字。数据建表脚本详细见分享出链接:链接:https://pan.baidu.com/s/18AxfOvXu9mtSfbtRcWAr7Q提取码:u7ir-- Sales.Orders订单表里用户编号、货船编号、运费示例数据SELECT T.原创 2021-09-01 18:14:05 · 521 阅读 · 1 评论 -
SQL Server通过动态视图里查找阻塞超过30秒的会话
SQL Server通过动态视图里查找阻塞的会话简介对于阻塞我们可以通过动态视图dm_exec_requests、dm_tran_locks等关联通过构建递归式树形结构来查找出阻塞超过30秒的会话。阻塞查询/*Author: Kenneth FisherOriginal link: https://sqlstudies.com/2017/01/18/lead-blocker/*/WITH Blocked_Sessions AS ( -- 找到所有阻塞的会话原创 2021-08-05 12:20:04 · 364 阅读 · 0 评论 -
SQL Server存储过程里全库查找引用的数据库对象(表、存储过程等)
SQL Server存储过程全库匹配数据库对象(表、存储过程等)简介可以通过自定义存储过程sp_eachdb来遍历每个数据库然后结合sys.objects 关联sys.sql_modules后的definition匹配存储过程里出现的对象。注:代码源于网络,本代码仅做技术交流自定义存储过程sp_foreachdbSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[sp_foreachdb原创 2021-08-05 12:03:33 · 866 阅读 · 0 评论 -
Mysql函数示例(如何定义输入变量与返回值)
Mysql 15位身份证升级18位函数案例简介基于mysql实现对较老的身份证(15)位升级成18位、围绕身份证计算出性别、从身份证里提取年龄。获取性别--1从身份证里提取出性别CREATE FUNCTION getGender(idcard varchar(50)) RETURNS varchar(50) CHARSET utf8BEGINDECLARE out_gender VARCHAR(4);DECLARE V_SEX VARCHAR(4);IF LENGTH(idca原创 2021-08-04 15:58:24 · 969 阅读 · 0 评论 -
取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例
Mysql 动态取第N个元素简介基于mysql实现对某个表的某个字段按照顺(逆)序取第N个排序对应的元素,该语句通过存储过程结合预处理实现,也可在程序语言里通过SQL拼接实现。示例--1存储过程实现第N个元素的查询DROP PROCEDURE usp_getNth;CREATE PROCEDURE usp_getNth(IN tab VARCHAR(100),IN col VARCHAR(100),IN sort VARCHAR(4),IN seq SMALLINT,OUT num i原创 2021-08-04 12:27:36 · 342 阅读 · 0 评论 -
Mysql时间数据分段累加求和案例之子查询与SUM窗口函数
Mysql时间段数分段据累加求和简介时间段数据的分段可以根据义务逻辑来划分,累加求和在mysql8.0及以上可以通过sum结合窗口函数来实现,低版本用子查询实现。需求对原始数据按照时间点3点前、6点前、12点前对数值的累计得到如下结果:时间段 累计3 66 1712 39原始数据附录如下:id inserttime num1 2020-07-30 00:00:00 12 2020-07-30 01:00:00 23 2020-07-30 02:00:00 3原创 2021-07-30 16:05:37 · 3095 阅读 · 0 评论 -
mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0
Mysql相邻数据(行)计算的自定义变量与Lead Lag窗口函数的案例1 相邻行 我们在处理数据时有时需要对业务上定义的相邻行进行统计计算。 比如我们想统计公司里所有部门最近2年或相邻年份)的成本差(这里假定公司每个部门每年的成本数据是逐行存取的),这就是典型的相邻行求解问题,因为我们拿到的数据是逐行的,但是我们需要知道指定排序规则后相邻的下行数据,以便实现最终需求。当前演示示例仅取某个指定排列规则里的第1、2名的差。2 代码示例2.1 表结构与数据-- #1创建表并初始化数据,原创 2021-07-22 12:29:08 · 711 阅读 · 1 评论 -
Mysql时间格式转换整理
时间格式转换整理Mysql里的时间格式转换有DATE_FORMAT()、STR_TO_DATE(),本文主要列出详细时间格式。Step 1:了解当前数据的区域编码为了更好的了解时间格式,我们先从国际化讲起,这里涉及到Locale(地区编码),众所周知实际上有许多国家,有不同的语言,那么对时间的...原创 2019-05-12 16:48:17 · 7387 阅读 · 0 评论 -
oracle字符串清洗、拆分案例
SELECT IDNO,MON,TO_DATE(MON,'YYYYMM') New_Day,SYSDATE-365*3 FROM( SELECT i_year,IDNO,SUBSTR(ID,1,b.lv),b.lv,INSTR(ID,',',1,b.lv)-1, CASE WHEN b.lv = 1 THEN i_year||SUBSTR(ID,1,INSTR...原创 2018-12-20 09:12:03 · 793 阅读 · 0 评论 -
处理时间_7_60个Mysql日期时间函数汇总
Mysql日期时间函数使用总结需求描述需求:列出mysql常见的日期、时间函数的使用方法以及注意事项。解决方法:通过参考相关手册以及验证来完成该需求。注:当前以mysql来演示。SQL代码-- mysqlSELECT CONVERT_TZ('2021-04-08 12:00:00','-08:00','+10:00'),CURDATE(),CURDATE() + 0 -- 返回YYYY-MM-DD或者YYYYMMDD...原创 2021-04-09 15:19:29 · 614 阅读 · 0 评论 -
处理时间_6_SQL Server常见的时间格式转换
列出常见的时间格式转换方法需求描述需求:对当前系统时间进行常见的时间格式转换。解决方法:通过CONVERT函数来完成.注:当前演示数据库为SQL ServerSQL代码-- SQL Serverselect getdate()-- 2020-05-14 13:08:08.199select CONVERT(varchar, getdate(), 120 )-- 2020-05-14 13:08:08select ...原创 2021-04-08 13:47:36 · 185 阅读 · 0 评论 -
处理时间_5_计算时间列所在年的周序号
计算时间列所在年的周序号需求描述需求:对EMP表里员工KING和SMITH的hiredate入职时间差,基于生成的日期算每天所在的周,相对于年.解决方法:通过DATE_FORMAT函数来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- Mysql:SELECT B.ename b_Ename,B.HIREDATE b_hiredate,A.ename a_Enam...原创 2021-04-08 11:26:40 · 293 阅读 · 0 评论 -
处理时间_4_计算时间列所在的周的序号
计算时间列所在的周的序号需求描述需求:对EMP表里员工KING和SMITH的hiredate入职时间及所在周序号.解决方法:通过DATEDIFF函数来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server:SELECT B.ename b_Ename,B.HIREDATE b_hiredate,A.ename a_Ename, A.HIREDATE ...原创 2021-04-08 11:23:22 · 184 阅读 · 0 评论 -
处理时间_3_计算两个时间列工作日差值
计算两个时间列工作日差值需求描述需求:对EMP表里员工KING和SMITH的hiredate入职时间差,这里单位是天且是工作日时间,即周末不计算在内.解决方法:通过DATEDIFF函数来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Serer:SELECT B.ename b_Ename,B.HIREDATE b_hiredate,A.ename a_Ena...原创 2021-04-08 11:15:32 · 334 阅读 · 0 评论 -
处理时间_2_计算两个时间列的差值
计算两个时间列的差值需求描述需求:对EMP表里员工KING和SMITH的hiredate入职时间差,这里单位是分钟、小时、天、周、月、年.解决方法:通过DATEDIFF函数来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- Mysql:SELECT B.ename b_Ename,B.HIREDATE b_hiredate,A.ename a_Ename, A.HIRED...原创 2021-04-08 11:11:22 · 379 阅读 · 0 评论 -
处理时间_1_对时间列进行加减
对时间列进行加减需求描述需求:对EMP表里员工编号为7369的hiredate按照天、月、年各加.解决方法:通过DATEADD函数来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server:SELECT empno,hiredate,DATEADD(DAY,1,hiredate) next_Day,DATEADD(MONTH,1,hiredate) nex...原创 2021-04-08 09:12:46 · 131 阅读 · 0 评论 -
窗口分析函数_18_算累计百分位数
计算累计百分位数需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取累计50百分位。解决方法:通过percentile_disc OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECT percentile_disc(0.5)WITHIN GROUP (ORDER BY s...原创 2021-04-07 14:08:05 · 329 阅读 · 0 评论 -
窗口分析函数_17_计算百分位数
计算百分位数需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取50百分位。解决方法:通过percentile_cont OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTpercentile_cont(0.5)WITHIN GROUP (ORDER BY sal) ...原创 2021-04-07 14:06:16 · 1565 阅读 · 0 评论 -
窗口分析函数_16_找出最后一个元素
找出最后一个元素需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取最后一个ENAME。解决方法:通过last_value OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTDISTINCT last_value (ename)over(partition by dep...原创 2021-04-07 14:04:21 · 333 阅读 · 0 评论 -
窗口分析函数_15_找出第一个元素
找出第一个元素需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取第一个ENAME。解决方法:通过first_value OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTDISTINCT first_value(ename)over(partition by dep...原创 2021-04-07 14:02:45 · 120 阅读 · 0 评论 -
窗口分析函数_14_生成相邻下一个元素
生成相邻下一个元素需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取相邻的下一个SAL。解决方法:通过lag OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTename,lag(ename,1) over(partition by deptno order by...原创 2021-04-07 14:00:39 · 164 阅读 · 0 评论 -
窗口分析函数_13_生成相邻上一个元素
生成相邻上一个元素需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取相邻的上一个SAL。解决方法:通过lead OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTename,lead(ename,1) over(partition by deptno order ...原创 2021-04-07 13:58:57 · 171 阅读 · 0 评论 -
窗口分析函数_12_生成累计百分比排名
生成累计百分比排名需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序后生成累计百分比排名。解决方法:通过cume_dist OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTcume_dist() over(partition by deptno order by sal...原创 2021-04-07 13:56:57 · 298 阅读 · 0 评论 -
窗口分析函数_11_生成百分比排名
生成百分比排名需求描述需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序后生成百分比排名。解决方法:通过percent_rank OVER()来完成.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server、Oracle、Mysql 8.0SELECTpercent_rank() over(partition by deptno order...原创 2021-04-07 13:55:21 · 414 阅读 · 0 评论 -
窗口分析函数_10_计算组总和的占比
计算组总和的占比需求描述需求:计算EMP表按照deptno分组,计算每组的SAL总和与所以记录总和中的占比解决方法:通过每组SUM(SAL)窗口函数再除以记录总和来实现.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- Sql Server、Oracle:SELECT DISTINCT deptno,SUM(SAL)OVER(PARTITION BY deptno) AS s...原创 2021-04-06 16:27:33 · 788 阅读 · 0 评论 -
窗口分析函数_9_计算组内总和的占比
计算组内总和的占比需求描述需求:计算EMP表按照deptno分组,计算SAL在每组总和中的占比解决方法:通过每行的SAL除以每组的SUM(SAL)来实现.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server:SELECT A.deptno,SAL,CAST(ROUND(SAL/sum_num,2) AS DECIMAL(10, 2)) AS percent ...原创 2021-04-06 16:24:59 · 441 阅读 · 0 评论 -
窗口分析函数_8_计算某列的中间值
计算某列的中间值需求描述需求:计算EMP表按照deptno分组,找出排在中间的SAL解决方法:通过窗口函数集合COUNT(*)通过序号取模来判断.注: 数据库数据集SQL脚本详见如下链接地址员工表结构和数据初始化SQL脚本SQL代码-- SQL Server:SELECT B.deptno,A.sal middle_Sal,B.row_CN,CASE WHEN (B.row_CN%2=0) THEN B.row_CN/...原创 2021-04-06 16:22:35 · 183 阅读 · 0 评论