You are on page 1of 17

Introduction

WINDOW FUNCTIONS
Thực hiện thao tác trên một tập hợp các quan sát bằng cách nào đó liên quan đến hàng hiện
tại, là hàng mà chức năng cửa sổ hiện đang hoạt động
Chúng tương tự như các hàm tổng hợp GROUP BY , nhưng thay vì các hàng được nhóm
thành một hàng, tất cả các hàng vẫn ở trong đầu ra
Được sử dụng để
Nạp giá trị từ các hàng trước hoặc sau hàng hiện tại (VD: tính toán sự tang trưởng theo thời
gian)
Chỉ định thứ hạng cho các hàng và tính toán tổng số đang chạy và đường trung bình cộng

Row numbers: gán số hàng


Row numbers cho phép bạn tham chiếu một hàng theo vị trí hoặc chỉ mục của nó thay vì giá trị
của nó

FUNCTION_NAME() OVER(…)
OVER: chỉ ra rằng một hàm là một hàm cửa sổ
Các dấu ngoặc đơn sau OVER có thể để trống, nhưng chúng cũng có thể chứa các điều khoản
phụ
ORDER BY
PARTITION BY
ROWS/RANGE PRECEIDING/FOLLOWING/UNBOUNDED
ORDER BY

ORDER BY có thể được đặt cùng lúc trong OVER và bên ngoài OVER
Đầu tiên, ROW_NUMBER sẽ chỉ định các số dựa trên thứ tự trong OVER
Sau đó ORDER bên ngoài OVER sẽ tiếp quản và sắp xếp kết quả của bảng
 ODER BY bên trong OVER có hiệu lực trước ORDER BY bên ngoài OVER
LAG
LAG là một hàm cửa sổ có cột và một số n trả về giá trị của cột n hàng trước hàng hiện tại
LAG(column,n) OVER (…)

VD: n=1 là trả về giá trị của hàng trước đó


PARTITION BY
PARTITION BY: Chia bảng thành các phân vùng dựa trên các giá trị duy nhất của cột tương tự
như GROUP BY tuy nhiên khác ở chỗ kết quả của PARTITION BY không được cuộn vào một
cột
Các phân vùng được vận hành riêng biệt bởi WINDOW functions
VD: ROW_NUMBER sẽ đặt lại thành 1 cho hàng đầu tiên của mỗi phân vùng
LAG sẽ chỉ tìm nạp giá trị trước đó của một hàng nếu hàng trước đó của nó nằm trong cùng
một phân vùng
FETCHING
The four functions
RELATIVE(TƯƠNG ĐỐI): vì giá trị mà chúng tìm nạp luôn liên quan đến hàng hiện tại
LAG(column, n) trả về giá trị ở n hàng TRƯỚC hàng hiện tại
LEAD)column, n) trả về giá trị ở n hàng SAU hàng hiện tại

ABSOLUTE(TUYỆT ĐỐI) : Vì giá trị chúng trả về không phụ thuộc vào hàng hiện tại và tuyệt
đối đối với bảng hoặc phân vùng
FIRST_VALUE(column) trả về giá trị đầu tiên trong bảng hoặc phân vùng
LAST_VALUE(column) trả về giá trị cuối cùng trong bảng hoặc phân vùng

LAST_VALUE:
Theo mặc định, một Window bắt đầu ở bảng hoặc phân vùng và kết thúc ở hàng hiện tại
Nếu không có mệnh đề RANGE BETWEEN, LAST_VALUE sẽ nhận giá trị của hàng hiện tại
 Mệnh đề RANGE BETWEEN mở rộng cửa sổ đến cuối bảng hoặc phân vùng để giá trị
thực tế cuối cùng sẽ được tìm nạp
Ranking
The ranking functions:
ROW_NUMBER():
Gán số cho các hàng là một cách để xếp hạng chúng.
ROW_NUMBER luôn chỉ định các số duy nhất, ngay cả khi giá trị của hai hàng giống nhau.
Nó chọn một số chỉ số khác để chỉ định số nếu giá trị mà nó sắp xếp giống nhau(VD: Thứ tự
được chọn nội bộ)

RANK():
Chỉ định cùng một số cho các hàng có giá trị giống hệt nhau, bỏ qua các số tiếp theo trong
những trường hợp như vậy
DENSE_RANK() cũng chỉ định cùng một số cho các hàng với các giá trị giống hệt nhau, nhưng
không bỏ qua các số tiếp theo

 ROW_NUMBER và RANK sẽ có cùng thứ hạng cuối cùng, số hàng


 DENSE_RANK là tổng số các giá trị duy nhất đang được xếp hạng
Paging
Paging: là chia nhỏ dữ liệu thành(xấp xỉ) các phần bằng nhau
Uses(Công dụng):
API là giao diện để trao đổi dữ liệu giữa các nền tảng web khác nhau và nhiều API trả lại dữ
liệu trong Paging để giảm kích thước của dữ liệu được gửi và đáp ứng nhu cầu nhiều hơn
Ngoài ra, khi dữ liệu được sắp xếp theo số liệu, việc tách dữ liệu thành các phần tư hoặc phần
ba có thể giúp đánh giá hiệu suất vì người ta có thể biết điểm dữ liệu nằm ở phần ba trên cùng,
giữa hay dưới cùng

NTILE(n) Chia dữ liệu thành n trang xấp xỉ bằng nhau


Aggregate window functions
Bạn có thể sử dụng cả MAX và SUM cũng như COUNT, MIN và AVG làm WINDOW functions

MAX

SUM
Frames
Một khung luôn bắt đầu bằng RANGE BETWEEN hoặc ROWS BETWEEN

ROWS BETWEEN:
ROWS BETWEEN [START] AND [FINISH]
[START] và [FINISH] có thể là một trong 3 mệnh đề: PRECEDING, CURRENT FLOW và
FOLLOWING:
n PRECEDING xác định khung là bắt đầu hoặc kết thúc n hàng trước hàng hiện tại
CURRENT ROW là đặt bắt đầu hoặc kết thúc ở hiện tại
n FOLLOWING: đặt ở n hàng sau hàng hiện tại

Moving averages and totals


Moving average (MA):
Trung bình động là giá trị trung bình của n kỳ cuối cùng của các giá trị của cột.
Được sử dụng để biểu thị động lượng và xu hướng
Hữu ích trong việc loại bỏ tính thời vụ, sự biến động bình thường của số lượng đơn vị bán ra
mỗi ngày
Moving total: Là tổng của n kỳ cuối cung của các giá trị của một cột

ROWS vs RANGE
RANGE BETWEEN hoạt động giống như ROWS BETWEEN với một điểm khác biệt chính
RANGE xử lý các bản sao trong các cột trong mệnh đề phụ ORDER BY Dưới dạng thực thể
đơn lẻ trong khi ROWS thì không

Cột ROWS_RT có các giá trị bạn mong đợi, nhưng cột RANGE_RT xử lý các hàng với sao
chép các giá trị dưới dạng các hàng đơn lẻ, tổng cộng chúng trước rồi hiển thị tổng đó cho mỗi
hàng trùng lặp
( Tại vì có hai cái 50 nên cộng vào 100 r hiển thị hai lần
Có hai cái 60 nên cộng vào 120 r hiển thị hai lần)
 Trong thực tế ROWS BETWEEN hầu như luôn được sử dụng thay vì RANGE
BETWEEN
Pivoting
Pivoting biến đổi bảng bằng cách tạo các cột từ các giá trị duy nhất của một trong các cột của
bảng đó

Pivoted theo năm

Dễ quét hơn, đặc biệt nếu được xoay bởi một cột được sắp xếp theo thứ tự thời gian

CROSSTAB
Cho phép bạn xoay bảng theo một cột nhất định
Bạn sẽ cần sử dụng câu lệnh CREAT EXTENSION trước khi sử dụng CROSSTAB
CREAT EXTENSION làm cho các chức năng bổ sung trong tiện ích mở rộng có sẵn để sử
dụng .Phần mở rộng tablefunc chứa hàm CROSSTAB
Sau đó, đặt truy vấn nguồn(source query) của bạn vào giữa hai cặp ký hiệu $$
Cuối cùng, trong dấu ngoặc đơn sau ct, hãy viết tên cột và loại của bảng xoay vòng mới của
bạn
Tên cột là cột không được xoay và các giá trị duy nhất của cột được xoay

ROLLUP and CUBE


ROLLUP là mệnh đề phụ GROUP BY bao gồm các hàng bổ sung cho tổng hợp cấp nhóm
Nếu ROLLUP tất cả các cột GROUP BY, bạn sẽ có thêm một hàng với tổng số
ROLLUP là phân cấp; thứ tự của các cột trong mệnh đề ROLL UP ảnh hưởng đến kết quả đầu
ra . VD: Nếu
ROLLUP(Country,Medal), ta sẽ nhận được tổng cấp độ của Country
ROLLUP(Medal,Country) ta sẽ nhận được tổng cấp độ của Medal
Cả hai đều bao gồm tổng số
Các hàng mà Country được điền nhưng Medal là rỗng thể hiện Tổng cấp Country
Lưu ý rằng không có Tổng cấp độ Medal, vì đang ROLL UP theo Country rồi đến Medal

CUBE
CUBE giống như ROLL UP nhưng nó không phân cấp
Tạo ra tất cả tổng hợp cấp nhóm có thể có
CUBE(Country,Medal) tính tổng cấp Country, cấp Medal và Tổng cộng
Sử dụng ROLL UP khi có dữ liệu phân cấp trong các cột. Chẳng hạn như phần ngày tháng
Sử dụng CUBE khi bạn muốn có tất cả các tổng hợp cấp nhóm

A survey of useful functions


COALESCE nhận một danh sách các giá trị và trả về giá trị rỗng đầu tiên, đi từ trái sang phải
COALESCE(null,null,1,null,2) ?1
COALESCE rất hữu ích khi sử dụng các phép toán SQL trả về giá trị rỗng chẳng hạn như
 ROLL UP và CUBE
 Các phép toán khác trả về giá trị null là pivoting ( khi một số hàng không có bất kỳ giá trị
tương ứng nào cho các cột mới
 Các phép toán vị trí như LAG, luôn trả về giá trị rỗng cho hàng đầu tiên, vì nó không có
hàng trước đó
STRING_AGG
STRING_AGG nhận tất cả các giá trị của một cột và nối chúng, với dấu phân cách giữa mỗi giá
trị

STRING_AGG hữu ích khi bạn cần giảm số hàng được trả về

You might also like