嗨,大家好
在本文中,我列出了 5 个有用的 SQL 函数,并附有解释和查询示例👇🏻
这5个功能是
- COALESCE合并
- RANK排序
- DENSE_RANK密集排序
- ROW_NUMBER行号
- SUM()获取运行总计的函数
那么让我们从 COALESCE 函数开始
#合并
COALESCE 函数按从左到右的顺序计算表达式列表,并返回第一个非 NULL 表达式的值。如果所有表达式的计算结果为 NULL,则返回 NULL。
以下语句将首先返回非空值,即“intersystems”
SELECT COALESCE ( NULL , NULL , NULL , 'intersystems' , NULL , 'sql' )
SQLSQL
让我们创建下表以获取更多示例
CREATE TABLE EXPENSES( TDATE DATE NOT NULL , EXPENSE1 NUMBER NULL , EXPENSE2 NUMBER NULL , EXPENSE3 NUMBER NULL , TTYPE CHAR ( 30 ) NULL )
SQLSQL
现在让我们插入一些虚拟数据来测试我们的功能
INSERT INTO sqluser.expenses (tdate, expense1,expense2,expense3,ttype ) SELECT {d '2023-01-01' }, 500 , 400 , NULL , 'Present' UNION ALL SELECT {d '2023-01-01' }, NULL , 50 , 30 , 'SuperMarket' UNION ALL SELECT {d '2023-01-01' }, NULL , NULL , 30 , 'Clothes' UNION ALL SELECT {d '2023-01-02' }, NULL , 50 , 30 , 'Present' UNION ALL SELECT {d '2023-01-02' }, 300 , 500 , NULL , 'SuperMarket' UNION ALL SELECT {d '2023-01-02' }, NULL , 400 , NULL , 'Clothes' UNION ALL SELECT {d '2023-01-03' }, NULL , NULL , 350 , 'Present' UNION ALL SELECT {d '2023-01-03' }, 500 , NULL , NULL , 'SuperMarket' UNION ALL SELECT {d '2023-01-04' }, 200 , 100 , NULL , 'Clothes' UNION ALL SELECT {d '2023-01-06' }, NULL , NULL , 100 , 'SuperMarket' UNION ALL SELECT {d '2023-01-06' }, NULL , 100 , NULL , 'Clothes'
SQLSQL
选择数据
现在通过使用 COALESCE 函数,我们将首先从 expense1、expense2 和 expense 3 列中检索非 NULL 值
SELECT TDATE, COALESCE (EXPENSE1,EXPENSE2,EXPENSE3), TTYPE FROM sqluser.expenses ORDER BY 2
SQLSQL
#RANK vs DENSE_RANK vs ROW_NUMBER 函数
- RANK() — 为同一窗口框架内的每一行分配一个排序整数,从 1 开始。如果多行包含相同的窗口函数字段值,则排序整数可以包含重复值。
- ROW_NUMBER() — 为同一窗口框架内的每一行分配一个唯一的顺序整数,从 1 开始。如果多行包含相同的窗口函数字段值,则每一行都分配一个唯一的顺序整数。
- DENSE_RANK() 离开 重复排名后没有间隙。
在 SQL 中,您可以通过多种方式为行分配排名,我们将通过示例深入探讨。再次考虑与之前相同的示例,但现在我们想知道最高费用是多少。
我们想知道我在哪里花的钱最多。有不同的方法可以做到这一点。我们可以使用所有 ROW_NUMBER()
, RANK()
和 DENSE_RANK()
三个函数 。我们将使用所有三个函数对上一个表进行排序,并使用以下查询查看它们之间的主要区别是什么:
下面是我们的查询:
这三个功能之间的主要区别在于它们处理相同值的方式。我们将进一步深入探讨它们的差异:
- RANK()----从 1 开始为每一行返回一个唯一的数字。当数值相等时,如果没有定义第二个条件,它会任意分配一个数字。
- ROW_NUMBER() -----从1开始为每一行返回一个唯一的数字,除非数值相同,否则它将分配相同的数字。同样,重复的排名后会有空格。
- DENSE_RANK()----- 重复排名后不留空格。
#计算运行总计
运行总计可能是最有用的窗口函数之一,尤其是当您想要可视化增长时。使用SUM()的窗口函数,我们可以计算累积聚合。
为此,我们只需要使用聚合器SUM()对变量求和,但使用 TDATE 列对该函数进行排序。
您可以观察到相应的查询如下:
正如您在上表中看到的那样,现在我们有了随着日期过去所花金额的累计汇总。
结论
SQL 很棒。上面使用的函数在处理数据分析、数据科学和任何其他与数据相关的领域时可能很有用。
这就是为什么我们应该注意不断提高 SQL 技能的原因。
谢谢