若干个进阶SQL 进阶技巧
1.常见表表达式(CTEs)
with toronto_ppl as (SELECT DISTINCT nameFROM populationWHERE country = "Canada"AND city = "Toronto"
)
, avg_female_salary as (SELECT AVG(salary) as avgSalaryFROM salariesWHERE gender = "Female"
)
SELECT name, salary
FROM People
WHERE name in (SELECT DISTINCT FROM toronto_ppl)AND salary >= (SELECT avgSalary FROM avg_female_salary)
2.递归CTEs
with org_structure as (SELECT id, manager_idFROM staff_membersWHERE manager_id IS NULLUNION ALLSELECT sm.id, sm.manager_idFROM staff_members smINNER JOIN org_structure osON os.id = sm.manager_id
3.临时函数
CREATE TEMPORARY FUNCTION get_seniority(tenure INT64) AS (CASE WHEN tenure < 1 THEN "analyst"WHEN tenure BETWEEN 1 and 3 THEN "associate"WHEN tenure BETWEEN 3 and 5 THEN "senior"WHEN tenure > 5 THEN "vp"ELSE "n/a"END
);
SELECT name, get_seniority(tenure) as seniority
FROM employees
4.自联结
SELECT a.Name as Employee
FROM Employee as a JOIN Employee as b on a.ManagerID = b.Id
WHERE a.Salary > b.Salary
5.Rank vs Dense Rank vs Row Number
SELECT Name , GPA , ROW_NUMBER() OVER (ORDER BY GPA desc) , RANK() OVER (ORDER BY GPA desc) , DENSE_RANK() OVER (ORDER BY GPA desc)
FROM student_grades
6.Lead()函数和LAG()函数
取某一个月,Lag()就是跟这个月之前的月份去对比,
Lead()就是跟这个月之后的月份去对比。
- lag(param1, param2, param3)取前N行
- 取前N行
- param1:表中列名
- param2:前N行
- param3:超出行数时默认设置值, 没设置就是null
- lead()跟lag()一样的意思
例如:查找每个客户的订单日期和下一个订单日期
SELECT customerName,orderDate,LEAD(orderDate,1) OVER ( #返回的值是向前一行的orderDate,没有定义后续行,返回NULL。PARTITION BY customerNumber #根据customerNumber分组ORDER BY orderDate ) nextOrderDate #根据orderDate排序
FROM orders
INNER JOIN customers USING (customerNumber); 结果输出:
+------------------------------------+------------+---------------+
| customerName | orderDate | nextOrderDate |
+------------------------------------+------------+---------------+
| Atelier graphique | 2013-05-20 | 2014-09-27 |
| Atelier graphique | 2014-09-27 | 2014-11-25 |
| Atelier graphique | 2014-11-25 | NULL |
| Signal Gift Stores | 2013-05-21 | 2014-08-06 |
| Signal Gift Stores | 2014-08-06 | 2014-11-29 |
| Signal Gift Stores | 2014-11-29 | NULL |
| Australian Collectors, Co. | 2013-04-29 | 2013-05-21 |
| Australian Collectors, Co. | 2013-05-21 | 2014-02-20 |
| Australian Collectors, Co. | 2014-02-20 | 2014-11-24 |
| Australian Collectors, Co. | 2014-11-24 | 2014-11-29 |
| Australian Collectors, Co. | 2014-11-29 | NULL |
| La Rochelle Gifts | 2014-07-23 | 2014-10-29 |
| La Rochelle Gifts | 2014-10-29 | 2015-02-03 |
| La Rochelle Gifts | 2015-02-03 | 2015-05-31 |
| La Rochelle Gifts | 2015-05-31 | NULL |
| Baane Mini Imports | 2013-01-29 | 2013-10-10 |
| Baane Mini Imports | 2013-10-10 | 2014-10-15 |
...
又或者,查找所有至少连续出现三次的数字
输入表格:
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+SQL语句:
SELECT DISTINCT Num as ConsecutiveNums
FROM(SELECT Id,Num,Lead(Num,1)OVER() as num_1, #选择指定行的向前一行的内容Lead(Num,2)OVER() as num_2 #选择指定行的向前两行的内容FROM Logs
) as c
WHERE c.Num = c.num_1 AND c.num_1 = c.num_2 #这三个数都要相等。结果输出:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
7.SUM()的窗口函数
SELECT Month, Revenue,
SUM(Revenue) OVER (ORDER BY Month) AS Cumulative
FROM monthly_revenue
8.日期时间
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+---------+------------------+------------------+Answer:
SELECT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature AND DATEDIFF(a.RecordDate, b.RecordDate) = 1
若干个进阶SQL 进阶技巧相关推荐
- SQL 进阶技巧(上)
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...
- 干货 | SQL 进阶技巧
来源于码海,作者码海 由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQ ...
- SQL进阶随笔--case用法(一)
SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...
- python进阶17炫技巧
原创博客链接:python进阶17炫技巧 原则:可读性第一(效率固然重要,除非非常明显的效率差异,否则可读性优先) 学习炫技巧,更多为了读懂他人代码,自己开发过程中,相似代码量(可读性),建议使用通俗 ...
- 算法人必懂的进阶SQL知识,4道面试常考题
(图片付费下载自视觉中国) 作者 | 石晓文 来源|小小挖掘机(ID:wAlsjwj) 近期在不同群里有小伙伴们提出了一些在面试和笔试中遇到的Hive SQL问题,Hive作为算法工程师的一项必备技能 ...
- MySQL进阶SQL优化
MySQL进阶SQL优化 查询效率分析: 子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代. 如果要用子查询,那就用EXISTS替代IN.用NOT ...
- 【SQL进阶】03.执行计划之旅1 - 初探
听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...
- SQL进阶,子查询与窗口函数
本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...
- .NET深入实战系列—Linq to Sql进阶
.NET深入实战系列-Linq to Sql进阶 最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基 ...
最新文章
- jQuery获取带点的id元素
- 组合模式(Composition)
- python 示例_Python中带有示例的关键字除外
- Docker持续交付部署类型
- android中的饱和机制,Android事件分发机制收藏这一篇就够了,通用流行框架大全...
- Java反序列化漏洞研究
- QQ群一键加群代码调用官方API
- 使用PaddlePaddle.org工具构建PaddlePaddle文档
- ZOJ 3502	 Contest 状态压缩 概率 DP
- http中响应状态码表示的意义?
- 2021-08-01 Python-爬虫练手:爬取上千张“萌妹子“网美图
- centos 6 下远程桌面工具
- 三维视觉之结构光原理详解
- WPF AirSpace 空域问题解决方案
- 轻量化网络结构——MobileNet
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)比赛总结
- 6-禅宗的形成及其基本观念
- 超级计算机大赛要学什么,超级计算机竞赛“七步成诗”仅三队完赛
- java utf8 简繁转换 类库_JAVA简繁转换(对象)解决办法
- C++快速入门|系列(第一篇)
热门文章
- 村子中有50个人,每人有一条狗
- 漫画 | 我是一条健忘的内存
- 亚马逊全球开店戴竫斐:2021中国出口跨境电商的蜕变与破局
- Web浏览器基于Flash实时播放监控视频(一)
- Fri Feb 22 20:22:00 CST 2019字符串型转date
- python量化投资代码_手把手教你用三行python 代码做一个动量策略「量化投资系列」...
- 计算机组成原理第一章课件,计算机组成原理第一章课件.ppt
- 11.8-11.13
- Android Studio快捷键记录
- 本周最新文献速递20210321