Khảo sát các hàm hữu ích

Phân tích dữ liệu kinh doanh bằng SQL

Michel Semaan

Data Scientist

Xử lý ngày tháng

  • 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

  • Ngày dễ đọc rất quan trọng trong báo cáo
  • Định dạng mặc định '2018-08-13' không dễ đọc
  • Làm sao chuyển từ '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'
Phân tích dữ liệu kinh doanh bằng SQL

TO_CHAR()

  • 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

  • Ví dụ: DD → Số ngày (01 - 31)
    • TO_CHAR('2018-06-01', 'Dy - DD') → 'Fri - 01'
    • TO_CHAR('2018-06-02', 'Dy - DD') → 'Sat - 02'
Phân tích dữ liệu kinh doanh bằng SQL
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

Phân tích dữ liệu kinh doanh bằng SQL

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
Phân tích dữ liệu kinh doanh bằng SQL

Ôn lại window functions

  • SUM(...) OVER (...): Tính tổng lũy kế của một cột
    • Ví dụ: SUM(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ước
    • Ví dụ: LAG(mau) OVER (ORDER BY active_month) trả về MAU của tháng trước
  • RANK() OVER (...): Gán hạng cho mỗi hàng theo thứ tự sắp xếp
    • Ví dụ: RANK() 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 ra
Phân tích dữ liệu kinh doanh bằng SQL

Truy 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
Phân tích dữ liệu kinh doanh bằng SQL

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

Khảo sát các hàm hữu ích

Phân tích dữ liệu kinh doanh bằng SQL

Preparing Video For Download...