Hàm LAG trong SQL Server
Trong bài này mình sẽ hướng dẫn cách sử dụng hàm LAG
trong SQL Server
thông qua cú pháp và ví dụ thực tế.
1. Mô tả
Hàm LAG
là một hàm phân tích cho phép bạn truy vấn nhiều hàng trong một bảng mà không cần phải nối bảng với chính nó. Nó trả về các giá trị từ một hàng trước trong bảng.
2. Cú pháp
Cú pháp của hàm LAG
trong SQL Server
(Transact-SQL) là:
LAG ( expression [, offset [, default] ] ) OVER ( [ query_partition_clause ] order_by_clause )
Trong đó:
Bài viết này được đăng tại [free tuts .net]
expression
: Một biểu thức có thể chứa các hàm dựng sẵn khác, nhưng không thể chứa bất kỳ hàm phân tích nào.offset
: Không bắt buộc. Nó là phần bù vật lý từ hàng hiện tại trong bảng. Nếu tham số này bị bỏ qua, mặc định là 1.default
: Không bắt buộc. Đó là giá trị được trả về nếu phần bù đi ra khỏi giới hạn của bảng. Nếu tham số này bị bỏ qua, mặc định là null.query_partition_clause
: Không bắt buộc. Nó được sử dụng để phân vùng kết quả thành các nhóm dựa trên một hoặc nhiều biểu thức.order_by_clause
: Không bắt buộc. Nó được sử dụng để sắp xếp dữ liệu trong mỗi phân vùng.
3. Version
Hàm LAG
có thể được sử dụng trong các phiên bản sau của SQL Server
(Transact-SQL):
- SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012
4. Ví dụ
Nếu chúng ta có một bảng employees chứa dữ liệu sau:
employee_number | last_name | first_name | salary |
dept_id |
12009 | Sutherland | Barbara | 54000 | 45 |
34974 | Yates | Fred | 80000 | 45 |
34987 | Erickson | Neil | 42000 | 45 |
45001 | Parker | Sally | 57500 | 30 |
75623 | Gates | Steve | 65000 | 30 |
Và chúng ta chạy câu lệnh SQL sau:
SELECT dept_id, last_name, salary, LAG (salary,1) OVER (ORDER BY salary) AS lower_salary FROM employees;
Nó sẽ trả về kết quả sau:
dept_id |
last_name | salary | lower_salary |
45 | Erickson | 42000 | NULL |
45 | Sutherland | 54000 | 42000 |
30 | Parker | 57500 | 54000 |
30 | Gates | 65000 | 57500 |
45 | Yates | 80000 | 65000 |
Trong ví dụ này, hàm LAG
sẽ sắp xếp theo thứ tự tăng dần tất cả các giá trị salary trong bảng employees và sau đó trả về mức lương thấp hơn 1 vị trí trong tập kết quả do đã sử dụng offset là 1.
Nếu chúng ta sử dụng offset bằng 2 thay vào đó, nó sẽ trả lại mức lương thấp hơn 2 mức lương. Nếu sử dụng offset 3, thì nó sẽ trả lại mức lương thấp hơn 3 .... và cứ thế.
Sử dụng Partitions
Bây giờ hãy xem xét một ví dụ phức tạp hơn trong đó sử dụng mệnh đề truy vấn partition để trả lại mức lương thấp hơn cho mỗi nhân viên trong bộ phận của họ.
Nhập câu lệnh SQL sau:
SELECT dept_id, last_name, salary, LAG (salary,1) OVER (PARTITION BY dept_id ORDER BY salary) AS lower_salary FROM employees;
Nó sẽ trả về kết quả sau:
dept_id |
last_name |
salary | lower_salary |
30 | Parker | 57500 | NULL |
30 | Gates | 65000 | 57500 |
45 | Erickson | 42000 | NULL |
45 | Sutherland | 54000 | 42000 |
45 | Yates | 80000 | 54000 |