在PostgreSQL中,LAG()函數用於訪問一行那在當前行之前以特定的物理偏移量出現。的PostgreSQL LAG()函數提供對在指定物理偏移量的當前行之前的行的訪問。換句話說,從當前行開始,LAG()函數可以訪問前一行或前一行之前的行的數據,依此類推。 LAG()函數對於比較當前行和上一行的值非常有用。
下麵顯示了LAG()函數的語法:
用法: LAG(expression [, offset [, default_value]]) OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... )
讓我們分析以上語法:
- 這個表達將根據當前行之前指定偏移量的行進行評估。它可以是列,表達式或子查詢。
- 這個抵消是一個正整數,指定行數那 來在要從中訪問數據的當前行之前。的抵消可以是表達式,子查詢或列。默認為1。
- 這個LAG()函數將返回default_value 萬一抵消超出了分區的範圍。
- PARTITION BY子句將行劃分為應用了LAG()函數的分區。默認情況下,如果用戶忽略PARTITION BY子句,該函數會將整個結果集視為一個分區。
- 這個排序子句指定每個分區中行的順序LAG()函數已應用。
範例1:
讓我們為演示建立一個新表,名稱為銷售量:
CREATE TABLE sales( year SMALLINT CHECK(year > 0), group_id INT NOT NULL, amount DECIMAL(10, 2) NOT NULL, PRIMARY KEY(year, group_id) );
向其中添加一些數據:
INSERT INTO sales(year, group_id, amount) VALUES (2018, 1, 1474), (2018, 2, 1787), (2018, 3, 1760), (2019, 1, 1915), (2019, 2, 1911), (2019, 3, 1118), (2020, 1, 1646), (2020, 2, 1975), (2020, 3, 1516);
在這裏LAG()函數返回當年和上一年的銷售額:
WITH cte AS ( SELECT year, SUM(amount) amount FROM sales GROUP BY year ORDER BY year ) SELECT year, amount, LAG(amount, 1) OVER ( ORDER BY year ) previous_year_sales FROM cte;
輸出:
範例2:
本示例使用LAG()函數比較每個產品組的當年銷售額與上一年的銷售額:
SELECT year, amount, group_id, LAG(amount, 1) OVER ( PARTITION BY group_id ORDER BY year ) previous_year_sales FROM sales;
輸出:
相關用法
- PostgreSQL ARRAY_AGG()用法及代碼示例
- PostgreSQL AVG()用法及代碼示例
- PostgreSQL COUNT()用法及代碼示例
- PostgreSQL STRING_AGG()用法及代碼示例
- PostgreSQL MAX()用法及代碼示例
- PostgreSQL MIN()用法及代碼示例
- PostgreSQL SUM()用法及代碼示例
- PostgreSQL DENSE_RANK用法及代碼示例
- PostgreSQL NULLIF()用法及代碼示例
- PostgreSQL Drop用法及代碼示例
- PostgreSQL FIRST_VALUE用法及代碼示例
- PostgreSQL LAST_VALUE用法及代碼示例
- PostgreSQL LEAD用法及代碼示例
- PostgreSQL NTILE用法及代碼示例
- PostgreSQL CUME_DIST用法及代碼示例
注:本文由純淨天空篩選整理自RajuKumar19大神的英文原創作品 PostgreSQL – LAG Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。