Ta nhìn vào bảng kết quả sau để hiểu rõ hơn về yêu cầu trên:
DEPTNO
|
ENAME
|
SAL
|
PRE_SAL
|
NEXT_SAL
|
20
|
SMITH
|
800
|
0
|
950
|
30
|
JAMES
|
950
|
800
|
1100
|
20
|
ADAMS
|
1100
|
950
|
1250
|
30
|
WARD
|
1250
|
1100
|
1250
|
30
|
MARTIN
|
1250
|
1250
|
1300
|
10
|
MILLER
|
1300
|
1250
|
1500
|
30
|
TURNER
|
1500
|
1300
|
1600
|
30
|
ALLEN
|
1600
|
1500
|
2450
|
10
|
CLARK
|
2450
|
1600
|
2850
|
30
|
BLAKE
|
2850
|
2450
|
2975
|
20
|
JONES
|
2975
|
2850
|
3000
|
20
|
SCOTT
|
3000
|
2975
|
3000
|
20
|
FORD
|
3000
|
3000
|
5000
|
10
|
KING
|
5000
|
3000
|
0
|
Và đây là kết quả câu SELECT:
1 2 3 4 5 6 | SELECT deptno, ename, sal, LAG (sal, 1, 0) OVER (ORDER BY sal) pre_sal, LEAD (sal, 1, 0) OVER (ORDER BY sal) next_sal FROM emp; |
Cú pháp 2 hàm này như sau:
LAG (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
LEAD (value_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause)
|
- LAG cho phép ta lấy kết quả của dòng trước đó, LEAD cho phép ta lấy kết quả của dòng sau đó
- value_expression: cột cần lấy kết quả
- offset: bước nhảy dòng hoặc số dòng trước đó hoặc sau đó
- default: giá trị default nếu như offset vượt quá ngưỡng. Như ví dụ trên ta thấy rằng dòng đầu tiên khi dùng hàm LAG thì trước đó không có dòng nào để lấy giá trị nên kết quả trả về sẽ là giá trị default mà ta nhập vào (ở đây là 0). Nếu như ta không nhập giá trị default này thì Oracle sẽ trả về cho chúng ta kết quả là NULL
- Lấy doanh số ngày n kèm theo doanh số ngày n-1
DATEAMOUNTAMOUNT201/01/201450000002/01/2014400005000003/01/20149000040000 - Lấy lịch sử đơn đặt hàng của khách hàng cho biết ngày đặt hàng, số lượng hàng của ngày đặt hàng và ngày đặt hàng trước đó
ORDER_DATEAMOUNTPRE_ORD_DATEPRE_ORD_AMOUNT01/01/201430009/01/20148001/01/20143016/01/20144009/01/201480 - V.v...
0 comments :
Post a Comment