Phân tích dữ liệu kinh doanh bằng SQL
Michel Semaan
Data Scientist
DATE_TRUNC('quarter', '2018-08-13') → '2018-07-01 00:00:00+00:00''2018-07-01 00:00:00+00:00' :: DATE → '2018-07-01'Ngày trong báo cáo
'2018-08-13' không dễ đọc'2018-08-13' sang 'Friday 13, August 2018'?Giải pháp
TO_CHAR('2018-08-13', 'FMDay DD, FMMonth YYYY') → 'Friday 13, August 2018'TO_CHAR(DATE, TEXT) → TEXT (chuỗi ngày đã định dạng)Ví dụ: Dy → Tên ngày viết tắt (Mon, Tues, v.v.)
TO_CHAR('2018-06-01', 'Dy') → 'Fri'TO_CHAR('2018-06-02', 'Dy') → 'Sat'Các mẫu trong chuỗi định dạng sẽ được thay bằng phần tương ứng của ngày; ký tự khác giữ nguyên
DD → Số ngày (01 - 31)TO_CHAR('2018-06-01', 'Dy - DD') → 'Fri - 01'TO_CHAR('2018-06-02', 'Dy - DD') → 'Sat - 02'| Pattern | Mô tả |
|---|---|
FMDay |
Tên ngày đầy đủ (Monday, Tuesday, v.v.) |
MM |
Tháng trong năm (01 - 12) |
Mon |
Tên tháng viết tắt (Jan, Feb, v.v.) |
FMMonth |
Tên tháng đầy đủ (January, February, v.v.) |
YY |
2 chữ số cuối của năm (18, 19, v.v.) |
YYYY |
Năm 4 chữ số (2018, 2019, v.v.) |
Tài liệu: https://www.postgresql.org/docs/9.6/functions-formatting.html
Truy vấn
SELECT DISTINCT
order_date,
TO_CHAR(order_date,
'FMDay DD, FMMonth YYYY') AS format_1,
TO_CHAR(order_date,
'Dy DD Mon/YYYY') AS format_2
FROM orders
ORDER BY order_date ASC
LIMIT 3;
Kết quả
order_date format_1 format_2
---------- ---------------------- ---------------
2018-06-01 Friday 01, June 2018 Fri 01/Jun 2018
2018-06-02 Saturday 02, June 2018 Sat 02/Jun 2018
2018-06-02 Sunday 03, June 2018 Sun 03/Jun 2018
SUM(...) OVER (...): Tính tổng lũy kế của một cộtSUM(registrations) OVER (ORDER BY registration_month) tính tổng đăng ký lũy kếLAG(...) OVER (...): Lấy giá trị từ hàng trướcLAG(mau) OVER (ORDER BY active_month) trả về MAU của tháng trướcRANK() OVER (...): Gán hạng cho mỗi hàng theo thứ tự sắp xếpRANK() OVER (ORDER BY revenue DESC) xếp hạng người dùng, nhà hàng hoặc tháng theo doanh thu đã tạo raTruy vấn
SELECT
user_id,
SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id
ORDER BY revenue DESC
LIMIT 3;
Kết quả
user_id revenue
------- -------
18 626
76 553.25
73 537
Truy vấn
WITH user_revenues AS (
SELECT
user_id,
SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id)
SELECT
user_id,
RANK() OVER (ORDER BY revenue DESC)
AS revenue_rank
FROM user_revenues
ORDER BY revenue_rank DESC
LIMIT 3;
Kết quả
user_id revenue_rank
------- ------------
18 1
76 2
73 3
Phân tích dữ liệu kinh doanh bằng SQL