本文解釋了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中文網其他相關文章!