Các chức năng xử lý phân tích trực tuyến OLAP tạo ra khả năng trả về các thông tin xếp hạng, đánh số hàng, và các hàm cột hiện có như một giá trị vô hướng trong một kết quả truy vấn.. Nh
Trang 1Hướng dẫn SQL & XQuery cho IBM DB2,
Phần 4: Phân tích dữ liệu
Sử dụng các truy vấn nâng cao để phân tích dữ liệu
Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM
Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM
Tóm tắt: Hướng dẫn này mô tả cách viết các truy vấn có yêu cầu phân tích dữ
liệu cơ bản Phần lớn các truy vấn chứa đựng các tính toán tuần tự, hay là những tính toán hoạt động trên một tập hợp có sắp thứ tự của các hàng -– những truy vấn thường gặp trong khi phân tích kinh doanh Các chức năng xử lý phân tích trực tuyến (OLAP) tạo ra khả năng trả về các thông tin xếp hạng, đánh số hàng, và các hàm cột hiện có như một giá trị vô hướng trong một kết quả truy vấn Hướng dẫn này là Phần 4 của loạt tài liệu hướng dẫn SQL & XQuery cho IBM® DB2®
Trước khi bạn bắt đầu
Về loạt bài này
Loạt tài liệu hướng dẫn này dạy các chủ đề SQL từ cơ bản đến nâng cao và các chủ đề XQuery cơ bản Nó cũng chỉ ra cách diễn đạt các câu hỏi nghiệp vụ thường gặp bằng các truy vấn cơ sở dữ liệu sử dụng các câu truy vấn SQL hay các câu truy vấn XQuery Những người phát triển ứng dụng và những người quản trị cơ sở
dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ liệu của mình Các thành viên tham gia sáng kiến học đường IBM có thể sử dụng loạt hướng dẫn này như một phần trong chương trình giảng dạy cơ sở dữ liệu của
họ
Tất cả các ví dụ trong bài này dựa trên Aroma, một cơ sở dữ liệu mẫu có chứa các
dữ liệu doanh thu về các sản phẩm cà phê và chè được bán trong các cửa hàng khắp nước Mỹ Mỗi ví dụ gồm có ba phần:
Một câu hỏi kinh doanh, được diễn đạt bằng ngôn ngữ hàng ngày
Một hoặc nhiều ví dụ truy vấn, được biểu diễn bằng SQL hay Xquery
Một bảng các kết quả được cơ sở dữ liệu trả về
Trang 2Cách trình bày hướng dẫn này cho phép các học viên tìm hiểu về ngôn ngữ SQL
và XQuery Cũng như với bất kỳ việc học tập nào, việc bổ sung thêm các bài tập thực hành là rất quan trọng Dữ liệu và các định nghĩa bảng tạo điều kiện thuận lợi cho các bài tập thực hành này
Đối với các sinh viên sử dụng tài liệu này như một phần của khoá học, hãy nhận từ thầy hướng dẫn của mình các chỉ dẫn để kết nối tới cơ sở dữ liệu Aroma và tìm hiểu mọi sự khác biệt giữa hướng dẫn và cài đặt tại máy cục bộ của mình
Hướng dẫn này được viết cho Express-C 9 DB2 trên nền UNIX®, Linux® và Windows® (trước đây gọi là Viper)
Về hướng dẫn này
Hướng dẫn này mô tả cách viết các truy vấn có yêu cầu một số cách phân tích dữ liệu Nhiều câu hỏi có chứa các tính toán tuần tự, hay các tính toán hoạt động trên một tập hợp có sắp xếp thứ tự của các hàng, các câu hỏi thường gặp trong khi phân tích hoạt động kinh doanh :
Tổng số luỹ kế (hay tổng số dịch chuyển) theo tháng là bao nhiêu?
Trung bình dịch chuyển theo tuần là bao nhiêu?
Kết quả xếp hạng các số doanh thu hàng tháng như thế nào?
Tỷ số doanh thu hiện tại hàng tháng với doanh thu hàng năm là bao nhiêu?
DB2 của IBM cung cấp một cách hiệu quả để trả lời các câu hỏi loại này khi sử dụng các hàm SQL OLAP tiêu chuẩn có trong DB2 9 Các chức năng xử lý phân tích trực tuyến (OLAP) tạo ra khả năng trả về các thông tin xếp hạng, đánh số hàng, và các hàm cột hiện có như một giá trị vô hướng trong một kết quả truy vấn Một hàm OLAP có thể được chứa trong các biểu thức trong một danh sách chọn lựa hay mệnh đề ORDER BY của một câu lệnh chọn
Hướng dẫn này gồm có một loạt các ví dụ với truy vấn kinh doanh và cú pháp kết hợp được trình bày trong mỗi trường hợp Trước khi thực hiện các truy vấn này,
hãy đọc các mô tả toàn bộ các chức năng OLAP trong SQL Reference Guide
(Hướng dẫn Tham khảo SQL)
Hướng dẫn này cũng cho thấy cách sử dụng các hàm vô hướng để tính toán và trích ra các thông tin ngày tháng, ví dụ như tên ngày trong tuần và tên tháng, từ các cột DATE (ngày tháng)
Trang 3Nhiều truy vấn trong chương này dựa vào các tổng gộp doanh thu Do các bảng
Sales (Doanh thu) lưu giữ các tổng số hằng ngày, nên thiết kế cơ sở dữ liệu của
bạn có thể bao gồm các bảng tổng gộp để trả lời các truy vấn này
Kết nối tới một cơ sở dữ liệu
Bạn cần kết nối tới một cơ sở dữ liệu trước khi có thể sử dụng các câu lệnh SQL
để truy vấn hay xử lý dữ liệu Lệnh CONNECT kết hợp một kết nối cơ sở dữ liệu với một tên người sử dụng
Thông qua người hướng dẫn tìm ra tên cơ sở dữ liệu bạn cần nối tới Đối với loạt bài này, tên cơ sở dữ liệu là aromadb
Để kết nối tới cơ sở dữ liệu aromadb, gõ lệnh sau đây vào trong bộ xử lý dòng lệnh DB2:
CONNECT TO aromadb USER userid USING password
Thay thế "userid" và "password" bằng số ID và mật khẩu của người sử dụng mà bạn đã nhận được từ thầy hướng dẫn Nếu máy không hỏi userid và password thì chỉ cần gõ vào lệnh sau đây:
CONNECT TO aromadb
Thông điệp sau báo cho bạn biết rằng đã tạo kết nối thành công:
Database Connection Information
Database server = DB2/NT 9.0.0
SQL authorization ID = USERID
Trang 4Local database alias = AROMADB
Khi đã kết nối được, bạn có thể bắt đầu sử dụng cơ sở dữ liệu
Các tổng số luỹ kế
Câu hỏi
Các số doanh thu hằng ngày của mặt hàng cà phê Roma Aroma trong tháng Giêng
2006 là gì? Các tổng con lũy kế theo Đôla và các số lượng bán ra trong tháng này
là gì?
Truy vấn OLAP
SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER(ORDER BY date ROWS
UNBOUNDED PRECEDING) AS run_dollars,
SUM(quantity) AS total_qty,
SUM(SUM(quantity)) OVER(ORDER BY date ROWS
UNBOUNDED PRECEDING) AS run_qty
FROM aroma.period a, aroma.sales b, aroma.product c
WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY date
Trang 7ROWS UNBOUNDED PRECEDING
Chỉ thị này ra lệnh cho hệ thống thực hiện hàm OLAP, trong trường hợp này là hàm SUM, trên tất cả các hàng đứng trước trong tập hợp kết quả Bạn có thể cũng chỉ rõ một tập con của các hàng khi sử dụng các giới hạn khác, ví dụ như GROUP-
BETWEEN Để biết thông tin chi tiết về các khung cửa sổ, xem SQL Reference Guide
Mệnh đề ORDER BY trong OLAP là then chốt Đặc tả này bảo đảm rằng các hàng
là đầu vào của hàm OLAP SUM được sắp xếp đúng thứ tự (theo ngày tháng Date,
trong trường hợp này) Nếu bạn quên sử dụng chỉ thị này, các hàng đầu vào có thể xếp sai thứ tự lôgíc và kết quả của bạn về tổng dịch chuyển sẽ không có nghĩa Mệnh đề ORDER BY cuối cùng trong truy vấn chỉ tác động đến cách hiển thị tập kết quả; nó đứng riêng và tách biệt với mệnh đề ORDER BY của hàm OLAP
Trang 8SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER(PARTITION BY week
ROWS UNBOUNDED PRECEDING) AS run_qty
FROM aroma.period a, aroma.sales b, aroma.product c
Trang 9WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY week, date
ORDER BY week, date;
Trang 112006-01-22 813.75 4437.50 115 618
Các phân vùng cửa sổ OLAP
Mệnh đề OLAP PARTITION BY bên trong mệnh đề OVER() cung cấp một
phương tiện bắt đầu lại các tính toán khi các giá trị trong các cột được phân vùng thay đổi Bạn có thể phân vùng các tính toán OLAP bằng một hoặc nhiều cột Trong truy vấn này bạn không tính đến WEEK như một cột được hiển thị mặc dù bạn sử dụng nó trong mệnh đề PARTITION BY Hệ thống nhận được số tuần từ cột DATE Tuy nhiên, các kết quả truy vấn của bạn có thể dễ dàng diễn giải hơn, nếu bạn đưa giá trị WEEK vào trong danh sách lựa chọn của bạn và định dạng bảng kết quả giống như kết quả khác
Dưới đây là truy vấn được cập nhật để tính đến cột week trong lệnh chọn và kết quả xuất ra
SELECT date, SUM(dollars) AS total_dollars,
SUM(SUM(dollars)) OVER (PARTITION BY week ORDER BY date
ROWS UNBOUNDED PRECEDING) AS run_dollars,
Trang 12WHERE a.perkey = b.perkey
AND c.prodkey = b.prodkey
AND c.classkey = b.classkey
AND year = 2006
AND month = 'JAN'
AND prod_name = 'Aroma Roma'
GROUP BY week, date
ORDER BY week, date
Trang 14FROM aroma.product a, aroma.sales b, aroma.period c
WHERE a.prodkey = b.prodkey
Trang 15AND a.classkey = b.classkey
AND c.perkey = b.perkey
Trang 18Hàm DEC được dùng để loại bỏ tất cả, chỉ để lại hai chữ số thập phân trong mỗi
giá trị Price (Giá):
dec(sum(dollars)/sum(quantity), 7, 2) AS price
Để biết thêm thông tin về hàm DEC và các chức năng định dạng các kiểu dữ liệu
khác, xem SQL Reference Guide
Trang 19SELECT t1.date, sales_cume_west, sales_cume_south,
sales_cume_west - sales_cume_south AS west_vs_south
WHERE a.mktkey = b.mktkey
AND b.storekey = c.storekey
AND d.perkey = c.perkey
AND year = 2006
AND month = 'MAR'
AND region = 'West'
GROUP BY date) AS t1 JOIN
(SELECT date, SUM(dollars) AS total_sales, SUM(SUM(dollars)) OVER(ORDER BY date
ROWS UNBOUNDED PRECEDING) AS sales_cume_south
FROM aroma.market a,
Trang 20aroma.store b,
aroma.sales c,
aroma.period d
WHERE a.mktkey = b.mktkey
AND b.storekey = c.storekey
AND d.perkey = c.perkey
AND year = 2006
AND month = 'MAR'
AND region = 'South'
Trang 21Trong truy vấn này mệnh đề ORDER BY DATE có trong mỗi hàm OLAP để bảo đảm các giá trị đúng được dùng để tính toán các tổng dịch chuyển Tại cuối truy vấn có thêm một mệnh đề ORDER BY DATE nữa để điều khiển cách hiển thị tập hợp kết quả
Trang 22Câu hỏi
Giá trị trung bình trượt ba tuần của doanh thu sản phẩm tại các cửa hàng ở San Jose và Miami trong quý ba năm 2005 là bao nhiêu?
Truy vấn OLAP
SELECT city, week, SUM(dollars) AS sales,
DEC(AVG(SUM(dollars)) OVER(partition by city
ORDER BY city, week ROWS 2 PRECEDING),7,2)
AS mov_avg,
SUM(SUM(dollars)) OVER(PARTITION BY city
ORDER BY week ROWS unbounded PRECEDING)
AS run_sales
FROM aroma.store a,
aroma.sales b,
aroma.period c
WHERE a.storekey = b.storekey
AND c.perkey = b.perkey
AND qtr = 'Q3_05'
AND city IN ('San Jose', 'Miami')
GROUP BY city, week;
Trong tập hợp kết quả sau đây, chú ý rằng các giá trị trung bình trong hai hàng đầu tiên với mỗi thành phố không phải là giá trị trung bình trượt ba tuần vì không có
đủ 3 dữ liệu để hoàn thành một tính toán như vậy Thay vào đó, hai giá trị trung bình ấy được tính toán đối với hàng đầu tiên (giá trị trung bình một tuần) và đối với hàng đầu tiên và hàng thứ hai (giá trị trung bình hai tuần) một cách tương ứng
Trang 24Hàm DEC dùng để định nghĩa có bao nhiêu chữ số sẽ được hiển thị trong giá trị
được trả về cho cột Mov_Avg Để biết các chi tiết về hàm này, xem SQL
ở đây n là một số đại diện cho hệ số san bằng muốn có Trong truy vấn trước đây
giá trị này nói chung được thiết lập bằng từ khóa “unbounded” (không giới hạn) Trong truy vấn này, vì bạn muốn tính giá trị trung bình trượt theo 3 hàng, bạn chèn
giá trị 2, để ngụ ý hàng hiện tại cộng với hai hàng trước
Trang 25Mệnh đề OLAP ORDER BY bảo đảm rằng hàm AVG được áp dụng vào chuỗi
dịch chuyển đúng của các hàng (trong trường hợp này là WEEK) Mệnh đề
PARTITION BY xác định giá trị mà theo nó hàm AVG sẽ được bắt đầu lại (trong
trường hợp này là CITY)
SELECT date, SUM(quantity) AS day_qty,
DEC(SUM(SUM(quantity)) OVER(ORDER BY date
ROWS 6 PRECEDING),7,2) AS mov_sum
FROM aroma.sales a, aroma.period b, aroma.product c
WHERE b.perkey = a.perkey
AND c.classkey = a.classkey
AND c.prodkey = a.prodkey
AND year = 2006
AND month = 'MAR'
AND prod_name = 'Demitasse Ms'
GROUP BY date
ORDER BY date;
Tập hợp kết quả OLAP sau đây có chứa các tổng số dịch chuyển cho tất cả các hàng Giống như trong truy vấn trung bình trượt trước đây, các giá trị thực tế của
Trang 26sáu hàng đầu tiên không hiển thị tổng trượt bảy ngày như mong muốn; bạn cần có bảy hàng để hiển thị chính xác giá trị đó
Trang 27Hàm vô hướng DEC được dùng để định nghĩa các giá trị thập phân được trả về
cho cột Mov_Sum Để biết các chi tiết về hàm này, xem SQL Reference Guide
Chú ý rằng trong ví dụ này, DEC làm cho các kết quả được hiển thị dưới dạng thập phân dù cho dữ liệu cơ sở có định dạng số nguyên
Trang 28Mệnh đề ORDER BY trong OLAP là then chốt Đặc tả này bảo đảm rằng các hàng
là đầu vào của hàm OLAP SUM được sắp xếp thứ tự đúng (theo Date tăng dần,
trong trường hợp này)
SELECT store_name, district, SUM(dollars) AS total_sales,
RANK() OVER(ORDER BY SUM(dollars) DESC)
Trang 29AND b.storekey = c.storekey
AND d.perkey = c.perkey
AND year = 2005
AND month = 'MAR'
AND region = 'West'
GROUP BY store_name, district;
Kết quả
Store_Name District Total_Sales Sales_Rank
Cupertino Coffee Supply San
Francisco 18670.50 1
Java Judy's Los Angeles 18015.50 2
Beaches Brew Los Angeles 18011.55 3
San Jose Roasting
Company
San Francisco 17973.90 4
Instant Coffee San
Francisco 15264.50 5
Roasters, Los Gatos San
Francisco 12836.50 6
Trang 30Các tổng số hằng ngày từ các bảng Sales thoả mãn các điều kiện tìm kiếm trong
mệnh đề WHERE được cộng lại, sau đó được xếp hạng
Hàm OLAP RANK
Cơ sở dữ liệu IBM DB2 hỗ trợ một tập hợp các hàm xếp hạng OLAP, gồm có RANK() và DENSE_RANK() Các hàm này không yêu cầu bất kỳ đối số nào; thay vào đó, mệnh đề OLAP ORDER BY định nghĩa cột hay biểu thức để dựa vào
đó mà xếp hạng Chú ý rằng thứ tự sắp xếp mặc định đối với các hàm OLAP là tăng dần (ASC), thường không phải là cách xếp hạng mong muốn cho các truy vấn
kinh doanh Bạn phải chỉ rõ từ khóa DESC trong mệnh đề OLAP ORDER BY để
gán các thứ hạng từ cao đến thấp (ở đây 1 là giá trị cao nhất)
Hàm DENSE_RANK khác với với RANK ở một chi tiết cụ thể: khi bạn sử dụng hàm RANK, nếu có sự ngang bằng giữa hai hoặc nhiều hàng thì giá trị thứ hạng sẽ nhảy qua xuống dưới Nếu hai hàng ngang bằng cùng xếp hạng là 2, vị trí tiếp theo
sẽ là 4 (như là 1,2,2,4) Khi bạn sử dụng DENSE_RANK, không có một khe hở nào trong chuỗi các giá trị thứ hạng Ví dụ, nếu hai hàng được xếp ở vị trí 8, vị trí tiếp theo vẫn là 9, như chỉ ra trong ví dụ sau:
SELECT prod_name, dollars, DENSE_RANK() OVER(ORDER
BY dollars DESC) AS dense_rank,
RANK() OVER(ORDER BY dollars DESC) AS
tie_rank
FROM aroma.product a,
aroma.sales b,
aroma.period c
WHERE a.prodkey = b.prodkey
AND a.classkey = b.classkey
AND c.perkey = b.perkey
Trang 31AND date = '01-03-2006';
Kết quả
PROD_NAME DOLLARS DENSE_RANK TIE_RANK
Trang 332003-10-04 2004-01-02 2004-04-01
2003-10-05 2004-01-03 2004-04-02
Tăng hoặc giảm các ngày tháng
Bạn có thể hoặc thêm vào hay xoá đi một ngày tháng Để làm như vậy bạn phải chỉ rõ thông tin sau đây:
Giá trị sẽ được tăng hay giảm (tên cột hay biểu thức datetime)
Thành phần sẽ áp dụng (các) cách tăng Thành phần này có thể là ngày, tháng, năm hay một kết hợp của các giá trị này
Giá trị mức tăng lên dương hay âm
Về truy vấn
Ví dụ truy vấn tính toán một ngày tháng ở trước 90 ngày và sau 90 ngày so với một ngày tháng đã cho Hàm này trả về giá trị theo định dạng ngày tháng thời gian ANSI SQL 92
Cần phải biết chắc chắn bạn muốn điều chỉnh giá trị nào Ví dụ, trong hầu hết các trường hợp, giá trị "90 ngày " không giống với "3 tháng" Nếu bạn thay đổi câu hỏi trên thành 3 tháng, khi đó, bạn sẽ có khả năng nhận được một tập hợp kết quả khác:
SELECT date - 3 MONTHS AS due_date,
date AS cur_date,
date + 3 MONTHS AS past_due
FROM aroma.period
WHERE year = 2004