本文解释了SQL窗口功能,有力的高级数据分析工具。它详细介绍了他们的语法,包括按子句按和顺序进行分区,并展示了它们在运行总数,排名,滞后/领先和移动平均值中的使用。
窗口函数(也称为分析功能)是SQL中强大的工具,可让您在与当前行相关的一组表行上执行计算。与汇总函数(如sum,avg,count)不同,将每个组排行并返回一个值的单个值,窗口函数在一组行(“窗口”)上操作而无需分组它们。这意味着您将所有原始行保留在结果集中,但根据窗口添加了计算的列。
基本语法涉及指定函数之后的OVER
子句。此子句定义了窗口。 OVER
子句中的关键组成部分是:
RANK
, ROW_NUMBER
和LAG/LEAD
功能至关重要。ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
包括当前行,前行和以下行。从分区的开头到当前行之间的所有行RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
包括所有行。例如,计算运行的销售总额:
<code class="sql">SELECT order_date, sales, SUM(sales) OVER (ORDER BY order_date) as running_total FROM sales_table;</code>
此查询计算到每个订单日期的累计销售总和。 ORDER BY
在这里至关重要。没有它,运行总数将是不可预测的。
窗口函数的用途非常广泛,并且在数据分析中具有许多应用。一些常见用例包括:
RANK()
, ROW_NUMBER()
, DENSE_RANK()
和NTILE()
之类的函数。LAG()
和LEAD()
函数被采用。窗口功能通常优于传统的SQL查询,这些查询使用自加入或子征服获得相似的结果。这是因为:
但是,重要的是要注意,性能增长取决于几个因素,包括数据集的大小,查询的复杂性以及所使用的特定数据库系统。在某些情况下,经过优化的传统查询可能仍然胜过窗口函数查询。
考虑这些场景,其中窗口功能显着简化了复杂的查询:
方案1:根据销售找到每个类别的前三种产品。
没有窗口功能,这将需要每个类别的自加入或子函数。使用窗口功能:
<code class="sql">WITH RankedSales AS ( SELECT product_name, category, sales, RANK() OVER (PARTITION BY category ORDER BY sales DESC) as sales_rank FROM products ) SELECT product_name, category, sales FROM RankedSales WHERE sales_rank </code>
方案2:与上个月相比,计算销售额的百分比变化。
使用LAG()
显着简化了以下简化:
<code class="sql">SELECT order_date, sales, (sales - LAG(sales, 1, 0) OVER (ORDER BY order_date)) * 100.0 / LAG(sales, 1, 1) OVER (ORDER BY order_date) as percentage_change FROM sales_table;</code>
这些示例说明了窗口功能如何大大降低复杂性并改善复杂SQL查询的可读性和性能。它们是进行高级数据分析的强大工具,应该是任何SQL开发人员工具包的关键部分。
以上是如何在SQL中使用窗口函数进行高级数据分析?的详细内容。更多信息请关注PHP中文网其他相关文章!