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 进阶技巧相关推荐

  1. SQL 进阶技巧(上)

    由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...

  2. 干货 | SQL 进阶技巧

    来源于码海,作者码海 由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQ ...

  3. SQL进阶随笔--case用法(一)

    SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...

  4. python进阶17炫技巧

    原创博客链接:python进阶17炫技巧 原则:可读性第一(效率固然重要,除非非常明显的效率差异,否则可读性优先) 学习炫技巧,更多为了读懂他人代码,自己开发过程中,相似代码量(可读性),建议使用通俗 ...

  5. 算法人必懂的进阶SQL知识,4道面试常考题

    (图片付费下载自视觉中国) 作者 | 石晓文 来源|小小挖掘机(ID:wAlsjwj) 近期在不同群里有小伙伴们提出了一些在面试和笔试中遇到的Hive SQL问题,Hive作为算法工程师的一项必备技能 ...

  6. MySQL进阶SQL优化

    MySQL进阶SQL优化 查询效率分析: 子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代. 如果要用子查询,那就用EXISTS替代IN.用NOT ...

  7. 【SQL进阶】03.执行计划之旅1 - 初探

    听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...

  8. SQL进阶,子查询与窗口函数

    本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...

  9. .NET深入实战系列—Linq to Sql进阶

    .NET深入实战系列-Linq to Sql进阶 最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基 ...

最新文章

  1. jQuery获取带点的id元素
  2. 组合模式(Composition)
  3. python 示例_Python中带有示例的关键字除外
  4. Docker持续交付部署类型
  5. android中的饱和机制,Android事件分发机制收藏这一篇就够了,通用流行框架大全...
  6. Java反序列化漏洞研究
  7. QQ群一键加群代码调用官方API
  8. 使用PaddlePaddle.org工具构建PaddlePaddle文档
  9. ZOJ 3502 Contest 状态压缩 概率 DP
  10. http中响应状态码表示的意义?
  11. 2021-08-01 Python-爬虫练手:爬取上千张“萌妹子“网美图
  12. centos 6 下远程桌面工具
  13. 三维视觉之结构光原理详解
  14. WPF AirSpace 空域问题解决方案
  15. 轻量化网络结构——MobileNet
  16. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)比赛总结
  17. 6-禅宗的形成及其基本观念
  18. 超级计算机大赛要学什么,超级计算机竞赛“七步成诗”仅三队完赛
  19. java utf8 简繁转换 类库_JAVA简繁转换(对象)解决办法
  20. C++快速入门|系列(第一篇)

热门文章

  1. 村子中有50个人,每人有一条狗
  2. 漫画 | 我是一条健忘的内存
  3. 亚马逊全球开店戴竫斐:2021中国出口跨境电商的蜕变与破局
  4. Web浏览器基于Flash实时播放监控视频(一)
  5. Fri Feb 22 20:22:00 CST 2019字符串型转date
  6. python量化投资代码_手把手教你用三行python 代码做一个动量策略「量化投资系列」...
  7. 计算机组成原理第一章课件,计算机组成原理第一章课件.ppt
  8. 11.8-11.13
  9. Android Studio快捷键记录
  10. 本周最新文献速递20210321