Trung bình cuộn hoặc Trung bình động là một số liệu hữu ích giúp bạn theo dõi giá trị trung bình trong một khoảng thời gian di chuyển (ví dụ:doanh số bán hàng trung bình trong 7 ngày qua). Tính toán đường trung bình động theo thời gian cho xu hướng hợp lý hơn, so với việc lập các con số hàng ngày. Vì không có chức năng tích hợp nào để tính toán trung bình động trong Redshift, nên đây là truy vấn SQL để thực hiện điều đó.
Cách tính Trung bình động trong Redshift
Dưới đây là các bước để tính toán trung bình động trong Redshift. Giả sử bạn có bảng sau chứa thông tin bán hàng hàng ngày trong Redshift.
# create table sales(order_date date,sale int); # insert into sales values('2020-01-01',20), ('2020-01-02',25),('2020-01-03',15),('2020-01-04',30), ('2020-01-05',20),('2020-01-10',20),('2020-01-06',25), ('2020-01-07',15),('2020-01-08',30),('2020-01-09',20); # select * from sales; +------------+------+ | order_date | sale | +------------+------+ | 2020-01-01 | 20 | | 2020-01-02 | 25 | | 2020-01-03 | 15 | | 2020-01-04 | 30 | | 2020-01-05 | 20 | | 2020-01-10 | 20 | | 2020-01-06 | 25 | | 2020-01-07 | 15 | | 2020-01-08 | 30 | | 2020-01-09 | 20 | +------------+------+
Giả sử bạn muốn tính toán mức trung bình động trong Redshift trong 5 ngày qua. Redshift (về cơ bản là Postgresql) làm cho việc này thực sự dễ dàng với sự trợ giúp của Redshift Window Functions. Đây là truy vấn SQL để tính toán mức trung bình động trong 5 ngày qua. Chúng ta sẽ xem xét nó một cách chi tiết bên dưới.
SELECT a.order_date,a.sale, AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS avg_sales FROM sales a ;
Nếu bạn muốn làm tròn kết quả, bạn có thể sử dụng hàm ROUND như được hiển thị để tính trung bình chạy trong Redshift
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a; order_date | sale | avg_sales ------------+------+--------------- 2020-01-01 | 20 | 20.00 2020-01-02 | 25 | 22.50 2020-01-03 | 15 | 20.00 2020-01-04 | 30 | 22.50 2020-01-05 | 20 | 22.00 2020-01-06 | 25 | 23.00 2020-01-07 | 15 | 21.00 2020-01-08 | 30 | 24.00 2020-01-09 | 20 | 22.00 2020-01-10 | 20 | 22.00
Hãy xem xét chi tiết truy vấn trên. Hàm AVG tính toán giá trị trung bình của hàng bán cột. Tuy nhiên, khi chúng tôi sử dụng nó cùng với hàm WINDOW OVER, nó chỉ tính giá trị trung bình cho cửa sổ mà chúng tôi xác định.
Đầu tiên, chúng tôi sử dụng ORDER BY trên dữ liệu của mình để đảm bảo rằng các hàng được sắp xếp theo thứ tự thời gian. Sau đó, chúng tôi xác định cửa sổ của chúng tôi cho mức trung bình bằng cách sử dụng hàm OVER và đề cập đến ROWS GIỮA 4 ROW CHÍNH XÁC VÀ HIỆN TẠI. Nghĩa là, đối với mỗi hàng, hãy tính giá trị trung bình cho 4 hàng trước đó và hàng hiện tại. Khi khung cửa sổ thay đổi cho mỗi hàng, chỉ 4 ngày trước đó và ngày hiện tại sẽ được sử dụng.
Bạn cũng có thể thêm bộ lọc bằng cách thêm mệnh đề WHERE trong truy vấn SQL ở trên.
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a WHERE condition;
Nếu bạn muốn tính toán trung bình động trong Redshift trong 30 ngày qua / 1 tháng, hãy sửa đổi truy vấn trên để sử dụng 29 ROWS CHÍNH XÁC VÀ ROW HIỆN TẠI
SELECT a.order_date,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM sales a;
Phần thưởng đọc:Cách tạo Pivot Table trong PostgreSQL
Cách tính Trung bình động trong Redshift trong 3 tháng qua
Giả sử bạn có dữ liệu bán hàng hàng tháng thay vì dữ liệu hàng ngày và muốn tính toán mức trung bình luân phiên trong 3 tháng qua.
# create table monthly_sales(order_month date,sale int); postgres=# insert into monthly_sales values('2019-12-01',20), ('2020-01-30',25),('2020-02-28',15),('2020-03-31',30), ('2020-04-30',20),('2020-05-31',20),('2020-06-30',25), ('2020-07-31',15),('2020-08-31',30),('2020-09-30',20); postgres=# select * from monthly_sales; order_month | sale -------------+------ 2019-12-01 | 20 2020-01-30 | 25 2020-02-28 | 15 2020-03-31 | 30 2020-04-30 | 20 2020-05-31 | 20 2020-06-30 | 25 2020-07-31 | 15 2020-08-31 | 30 2020-09-30 | 20
Chúng tôi sử dụng cùng một logic để tính toán đường trung bình trong Redshift, trong trường hợp này. ĐẶT HÀNG ĐẦU TIÊN BẰNG order_month để đảm bảo các hàng được sắp xếp theo thứ tự thời gian. Sau đó, tính giá trị trung bình cho TIẾN ĐỘ CHÍNH XÁC 2 ROW VÀ ROW HIỆN TẠI
SELECT a.order_month,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM monthly_sales a ; order_month | sale | avg_sales -------------+------+----------- 2019-12-01 | 20 | 20.00 2020-01-30 | 25 | 22.50 2020-02-28 | 15 | 20.00 2020-03-31 | 30 | 23.33 2020-04-30 | 20 | 21.67 2020-05-31 | 20 | 23.33 2020-06-30 | 25 | 21.67 2020-07-31 | 15 | 20.00 2020-08-31 | 30 | 23.33 2020-09-30 | 20 | 21.67
Phần thưởng đã đọc:Cách tính Tổng số đang chạy trong Redshift
Bạn cũng có thể thêm bộ lọc bằng cách bao gồm mệnh đề WHERE trong truy vấn SQL ở trên.
SELECT a.order_month,a.sale, round(AVG(a.sale) OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) AS avg_sales FROM monthly_sales a WHERE condition;
Bạn có thể tùy chỉnh truy vấn trên để tính toán trung bình động trong Redshift, theo yêu cầu của bạn.
Sau khi tính toán đường trung bình trong Redshift, bạn có thể sử dụng công cụ biểu đồ để vẽ biểu đồ trên biểu đồ đường và chia sẻ nó với nhóm của mình. Dưới đây là một ví dụ về biểu đồ đường trực quan hóa đường trung bình, được tạo bằng Ubiq.
Nếu bạn muốn tạo biểu đồ, trang tổng quan và báo cáo từ cơ sở dữ liệu Redshift, bạn có thể thử Ubiq. Chúng tôi cung cấp bản dùng thử miễn phí 14 ngày.