我已经成为数据专业人士 3 年了,看到其他人在几乎没有 SQL 知识或经验的情况下进入数据相关领域,我仍然感到惊讶。这一点我怎么强调都不为过,无论您渴望获得什么特定的数据角色,SQL 都是基础。
诚然,我见过一些在 SQL 以外的其他领域拥有出色技能的人获得了这份工作,但他们在被录用后仍然必须学习 SQL。我认为在不必学习 SQL 的情况下成为一名数据专业人士几乎是不可能的。
这些 SQL 技巧适用于所有人,无论您有多少经验。这些是我实际上经常使用的 SQL 技巧,不是一些新奇的东西,可能很有趣,但实际上并不适合您的工作流程。为方便起见,我按难度顺序列出了这些。
1. 检查表中的不同计数
- SELECT count(*), count(distinct patient_id) FROM patients
如果两列中的数字相等,那么您在查询的第二部分中计算的列可能是主键。这不是保证,但它可以帮助您解决问题。
当您有多个创建主键的列时,这只会稍微复杂一些。要解决这个问题,只需在 DISTINCT 关键字之后连接构成主键的列。一个简单的示例是连接沙箱表中的名字和姓氏以创建主键。
- SELECT count(*), count(distinct first_name || last_name) FROM patients
- SELECT
- first_name
- , count(*) as ct
-
- FROM patients
- GROUP BY
- first_name
- HAVING
- count(*) > 1
- ORDER BY
- COUNT(*) DESC
- ;
您可以使用 HAVING 关键字对重复的值进行排序。在沙盒数据库中,您可以看到名字“John”的重复频率最高。然后,您将运行另一个查询,在其中过滤到“John”以查看重复值的原因,并且您可以快速看到它们都有不同的姓氏和患者 ID。
3.用 DISTINCT 处理 NULLS
- with new_table as (
- select patient_id from patients
- UNION
- select null
- )
- select
- count(*)
- , count(distinct patient_id)
- , count(patient_id)
- from new_table
4. CTE > 子查询
- -- Use of CTE
- with combined_table as (
- select
- *
-
- FROM patients p
- JOIN admissions a
- on p.patient_id = a.patient_id
- )
- , name_most_admissions as (
- select
- first_name || ' ' || last_name as full_name
- , count(*) as admission_ct
-
- FROM combined_table
- )
- select * from name_most_admissions
- ;
- -- Use of sub-queries :(
- select * from
- (select
- first_name || ' ' || last_name as full_name
- , count(*) as admission_ct
-
- FROM (select
- *
-
- FROM patients p
- JOIN admissions a
- on p.patient_id = a.patient_id
- ) combined_table
- ) name_most_admissions
- ;
5. 一起使用 SUM 和 CASE
- select
- sum(case when allergies = 'Penicillin' and city = 'Burlington' then 1 else 0 end) as allergies_burl
- , sum(case when allergies = 'Penicillin' and city = 'Oakville' then 1 else 0 end) as allergies_oak
-
- from patients
这种组合也可以用在 WHERE 子句中,如下例所示。
- select
- *
- FROM patients
- WHERE TRUE
- and 1 = (case when allergies = 'Penicillin' and city = 'Burlington' then 1 else 0 end)
- with new_table as (
- select
- patient_id
- , first_name
- , last_name
- , time(birth_date, '+1 second') as birth_date
- from patients
- where TRUE
- and patient_id = 1
- UNION
-
- select
- patient_id
- , first_name
- , last_name
- , birth_date
- from patients
- WHERE TRUE
- and patient_id != 1
- )
- select
- birth_date
-
- from new_table
- where TRUE
- and birth_date between '1953-12-05' and '1953-12-06'
根据您的 SQL 开发 IDE,您的设置可能会隐藏显示时间组件。但仅仅因为时间是隐藏的,并不意味着它不是数据的一部分。
在上面的示例中,我人为地为患者 #1 添加了第二个。如您所见,当使用 BETWEEN 关键字时,这 1 秒足以将患者从结果中排除。
我看到数据专业人员缺少的另一个常见示例是加入仍然具有时间组件的日期。大多数情况下,他们实际上打算在截断日期加入,但最终没有得到他们想要的结果;或者更糟糕的是,他们没有意识到他们没有得到正确的结果。
7.不要忘记窗口函数
- select
- p.*
- , MAX(weight) over (partition by city) as maxwt_by_city
-
- from patients p
我见过一些分析师尝试变通方法,因为窗口函数可以使代码更短、更易读,并且很可能也节省了他们的时间。
有很多不同的窗口函数,但上面的示例是一个常见且简单的用例。
8. 尽可能避免 DISTINCT
以下最后 3 个提示没有要显示的特定代码片段,但与上述示例一样重要。到目前为止,我在我的职业生涯中发现,数据专业人员经常会在不了解数据的情况下添加不同的内容以防止重复。
这是个错误。如果您一开始就无法解释为什么数据中存在重复项,那么您可能会从分析中排除一些有用的信息。你应该总是能够解释为什么你在一张桌子上放一个 distinct 以及为什么会有重复。WHERE 子句通常是首选,因为您可以看到被排除的内容。
9. SQL 格式化
这已经说了很多,但需要重复。确保格式化您的 SQL。最好创建更多具有良好格式的行,而不是尝试将所有代码压缩在几行上。它将使您和他人的发展更快。最好创建更多具有良好格式的行,而不是尝试将所有代码压缩在几行上。它将使您和他人的发展更快。
您可以在上面的代码片段中看到,我在 WHERE 子句中使用了 TRUE 关键字。这是为了让 WHERE 子句中的所有参数都以 AND 开头。这样,论点从同一点开始。
另一个快速提示是在 SELECT 子句的列开头添加逗号。这使得任何缺少的逗号都很容易找到,因为它们都排成一行。
10. 调试提示
一些 SQL 查询可能是非常难以调试的问题。当我过去遇到这些问题时,对我帮助最大的是非常勤奋地记录我的步骤。
为了记录我的步骤,我将在查询前的注释中对一段代码进行编号。该评论描述了我在该查询部分中尝试执行的操作。然后我会在运行查询后在评论标题下方写下我的答案。
在调试时很容易看到你已经尝试过的东西,我保证你会用这种方法更快地解决它。
结论
希望您通过这些技巧学到了一些有用的东西。在使用 SQL 编码时,您发现了哪些有用的提示?最后,你想了解更多关于数据库的内容,请点击下方地址:
cda
https://edu.cda.cn/goods/show/651?targetId=2470&preview=0
题库


雷达卡






京公网安备 11010802022788号







