主要观点总结
本文介绍了SQL中的10个重要和相关的中级到高级概念,包括常见表表达式(CTEs)、递归CTEs、临时函数、使用CASE WHEN枢转数据、EXCEPT与NOT IN、自联结、Rank vs Dense Rank vs Row Number、计算Delta值、计算运行总数、日期时间操纵等。
关键观点总结
关键观点1: 常见表表达式(CTEs)
使用常见表表达式(CTEs)是模块化和分解代码的好方法。CTEs允许您完成更高级的技术,如创建递归表。
关键观点2: 递归CTEs
递归CTE是引用自己的CTE,尤其适用于查询组织结构图、文件系统、网页链接图等的分层数据。
关键观点3: 临时函数
临时函数允许您将代码的块分解为较小的代码块,适用于写入清洁代码,并防止重复。
关键观点4: 使用CASE WHEN枢转数据
CASE WHEN不仅用于分配某个值或类,还可以用于枢转数据,例如将每月收入转化为单独的列。
关键观点5: EXCEPT与NOT IN
这两个操作用于比较两个查询/表之间的行,但存在微妙的差别。
关键观点6: 自联结
一个SQL表可以通过自行连接自己来解决特定问题,比如查找员工的工资高于其管理人员的员工。
关键观点7: Rank vs Dense Rank vs Row Number
这些功能用于对行和价值进行排名,例如顶级客户、产品、国家等。
关键观点8: 计算Delta值
使用Lead和Lag函数比较不同时期的值以计算Deltas。
关键观点9: 计算运行总数
使用具有SUM的窗口函数可以计算运行总数。
关键观点10: 日期时间操纵
涉及日期时间数据的SQL问题很常见,例如将数据分组或将日期格式从DD-MM-Yyyy转换为YYYY-MM-DD。
正文
递归CTE是引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。
递归CTE有3个部分:
-
-
递归成员:引用CTE的递归查询。这是所有与锚构件的联盟
-
以下是获取每个员工ID的管理器ID的递归CTE的示例:
with org_structure as (
SELECT id
, manager_id
FROM staff_members
WHERE manager_id IS NULL
UNION ALL
SELECT sm.id
, sm.manager_id
FROM staff_members sm
INNER JOIN org_structure os
ON os.id = sm.manager_id
3.临时函数
如果您想了解有关临时函数的更多信息,请检查此项,但知道如何编写临时功能是重要的原因:
-
-
-
它可以防止重复,并允许您重用类似于使用Python中的函数的代码。
考虑以下示例:
SELECT name
, 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 AS seniority
FROM employees
相反,您可以利用临时函数来捕获案例子句。
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.使用CASE WHEN枢转数据