共计 3502 个字符,预计需要花费 9 分钟才能阅读完成。
举荐:应用 NSDT 场景编辑器助你疾速搭建可二次编辑的 3D 利用场景
咱们都晓得数据分析在当今数据驱动的世界中的重要性,以及它如何从可用数据中为咱们提供有价值的见解。但有时,数据分析对于数据分析师来说变得十分具备挑战性和耗时。现在它变得繁忙的次要起因是生成的数据量激增,并且须要内部工具来对其执行简单的剖析技术。
然而,如果咱们剖析数据库自身中的数据,并应用大大简化的查问呢?这能够应用 SQL 剖析函数来实现。本文将探讨能够在 SQL Server 中执行的各种 SQL 剖析函数,并取得有价值的后果。
这些函数基于一组行计算聚合值,超出了根本的行操作。它们为咱们提供了用于排名、工夫序列计算、窗口化和趋势剖析的工具。因而,在不节约任何工夫的状况下,让咱们通过一些细节和理论示例开始逐个探讨这些性能。本教程的先决条件是 SQL 查问的根本实际常识。
创立演示表
咱们将创立一个演示表并在此表上利用所有剖析函数,以便您轻松学习本教程。
留神:本教程中探讨的某些函数在 SQLite 中不存在。因而,最好应用 MySQL 或 PostgreSQL Server。
此表蕴含几个大学生的数据,蕴含四列学生证、学生姓名、主题和最终问题(满分 100 分)。
创立蕴含 4 列的学生表:
CREATE TABLE students
(
id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255),
subject VARCHAR(30),
final_marks INT
);
当初,咱们将在该表中插入一些虚构数据。
INSERT INTO Students (id, name, subject, final_marks)
VALUES (1, ‘John’, ‘Maths’, 89),
(2, 'Kelvin', 'Physics', 67),
(3, 'Peter', 'Chemistry', 78),
(4, 'Saina', 'Maths', 44),
(5, 'Pollard', 'Chemistry', 91),
(6, 'Steve', 'Biology', 88),
(7, 'Jos', 'Physics', 89),
(8, 'Afridi', 'Maths', 97),
(9, 'Ricky', 'Biology', 78),
(10, 'David', 'Chemistry', 93),
(11, 'Jofra', 'Chemistry', 93),
(12, 'James', 'Biology', 65),
(13, 'Adam', 'Maths', 90),
(14, 'Warner', 'Biology', 45),
(15, 'Virat', 'Physics', 56);
当初咱们将可视化咱们的表格。SELECT *
FROM students
输入:
咱们已筹备好执行剖析性能。
RANK()& DENSE_RANK()
RANK() 函数将依据指定的程序为分区内的每一行调配特定的排名。如果行在同一分区中具备雷同的值,则会为它们调配雷同的等级。
让咱们通过以下示例更分明地了解它。
SELECT *,
Rank()
OVER (ORDER BY final_marks DESC) AS 'ranks'
FROM students;
输入:
您能够察看到最终标记按降序排列,并且每行都与特定的等级相关联。您还能够察看到分数雷同的学生取得雷同的排名,跳过反复行后的下一个排名。咱们还能够找到每个科目的佼佼者,即咱们能够依据学科划分排名。让咱们看看如何做到这一点。
SELECT *,
Rank()
OVER (
PARTITION BY subject
ORDER BY final_marks DESC) AS 'ranks'
FROM students;
输入:
在此示例中,咱们依据主题对排名进行了分区,并且为每个主题独自调配排名。
留神:请留神,两名学生在化学科目中得分雷同,排名为 1,下一行的排名间接从 3 开始。它跳过了 2 的排名。
这是函数的特色,并不总是须要间断生成排名。下一个排名将是前一个排名和反复数字的总和。RANK() 为了克服这个问题,引入了相似于函数的工作形式,但它总是间断调配秩。依照以下示例操作:
DENSE_RANK()RANK()SELECT *,
DENSE_RANK()
OVER (
PARTITION BY subject
ORDER BY final_marks DESC) AS 'ranks'
FROM students;
输入:
上图显示所有排名都是间断的,即便反复标记在同一分区中也是如此。
NTILE()
NTILE() 函数用于将行划分为大小大抵相等的指定数量的(N)个桶。每行调配一个从 1 到 N(存储桶总数)的存储桶编号。
咱们还能够在特定的分区或程序上利用函数,这些函数在 PARTITION BY 和 ORDER BY 子句中指定。NTILE()
假如 N 不能齐全被行数整除。而后,该函数将创立不同大小的存储桶,相差一个。语法:NTILE(n) OVER (PARTITION BY c1, c2 ORDER BY c3)
该函数采纳一个必须的参数 N,即存储桶的数量和一些可选参数,如 PARTITION BY 和 ORDER BY 子句。将依据这些子句指定的程序划分行。NTILE()NTILE() 让咱们以思考咱们的“学生”表为例。假如咱们想依据学生的最终问题将他们分成几组。咱们将创立三个组。第 1 组将蕴含得分最高的学生。第 2 组将蕴含所有平庸的学生,第 3 组将包含低分学生。
SELECT *,
NTILE(3)
OVER (ORDER BY final_marks DESC) AS bucket
FROM students;
输入:
下面的示例显示所有行都按程序排序并分为三组,每组蕴含五行。final_marksNTILE() 当咱们想依据某些指定的规范将某些数据分成相等的组时很有用。它可用于基于购买物品的客户细分或对员工绩效进行分类等应用程序。
CUME_DIST()
该函数查找指定分区或程序内每行中特定值的累积散布。累积散布函数(CDF)示意随机变量 X 小于或等于 x 的概率。它用 F(x)示意,其数学公式示意为:
CUME_DIST()
P(x)是概率分布函数。在简略语言中,函数返回值小于以后行值的行的百分比。这将有助于剖析数据的散布以及值与汇合的绝对地位。
CUME_DIST()SELECT *,
CUME_DIST()
OVER (ORDER BY final_marks) AS cum_dis
FROM students;
输入:
下面的代码将依据所有行进行排序并找到累积散布,然而如果要依据主题对数据进行分区,则能够应用 PARTITION BY 子句。上面是如何执行此操作的示例。
final_marksSELECT *,
CUME_DIST()
OVER (
PARTITION BY subject
ORDER BY final_marks) AS cum_dis
FROM students;
输入:
在下面的输入中,咱们看到了按主题名称分区的累积散布。final_marks
STDDEV()和 VARIANCE()
该函数用于查找分区中给定值的方差。在统计学中,方差示意数字与其平均值相距甚远的水平,或者示意数字之间的扩散水平。它由?^2 示意。VARIANCE() 该函数用于查找分区内给定值的标准偏差。标准差还测量数据中的变异,它等于方差的平方根。它由?.STDDEV() 这些参数能够帮忙咱们找到数据中的离散性和可变性。让咱们看看咱们如何理论做到这一点。
SELECT *,
STDDEV(final_marks)
OVER (PARTITION BY subject) AS marks_stddev,
VARIANCE(final_marks)
OVER (PARTITION BY subject) AS marks_variance
FROM students;
输入:
下面的输入显示了每个科目的最终分数的规范变异和方差。
FIRST_VALUE()和 LAST_VALUE()
该函数将依据特定程序输入分区的第一个值。同样,该函数将输入该分区的最初一个值。当咱们想要辨认指定分区的第一次和最初一次呈现时,能够应用这些函数。FIRST_VALUE()LAST_VALUE() 语法:SELECT *,
FIRST_VALUE(col1)
OVER (
PARTITION BY col2, col3
ORDER BY col4) AS first_value
FROM table_name
论断
SQL 剖析函数为咱们提供了在 SQL 服务器中执行数据分析的性能。应用这些性能,咱们能够开释数据的真正后劲,并从中取得有价值的见解,以减少咱们的业务。除了下面探讨的性能之外,还有更多优良的性能能够十分疾速地解决您的简单问题。您能够从本文中浏览无关这些剖析函数的更多信息 Microsoft.
原文链接:数据库内剖析:利用 SQL 的剖析性能