Chuyển đến nội dung chính
Mô-đun 7 · Bài học 3 trong tổng số 427/57 trong khóa học~12 min
Bài học theo mô-đun (3/4)

Tổng số LAG, LEAD và đang chạy

LAG và LEAD là hai chức năng cửa sổ đặc biệt cho phép bạn truy cập vào các hàng khác của cùng một phân vùng: hàng trước đó (LAG) hoặc hàng cái tiếp theo (LEAD) theo ORDER BY của cửa sổ. Họ là công cụ truy cập để so sánh từng hàng (delta, biến thể, khoảng) và — kết hợp với SUM/AVG/COUNT OVER — để có tổng số đang chạy.

LAG: hàng trước

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

Ví dụ: đối với mỗi đơn hàng, “số ngày kể từ đơn hàng trước bằng nhau khách hàng":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

Đơn hàng đầu tiên của mỗi khách hàng có since_previous_order = NULL vì không có "trước" trong phân vùng.

DẪN: hàng tiếp theo

Tấm gương của LAG. Điển hình: “thời gian cho đến sự kiện tiếp theo”, “sự khác biệt với phiên bản tiếp theo".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

Tổng số đang chạy: tổng hợp với tài

Các hàm tổng hợp (SUM, AVG, COUNT, MAX, MIN) trở thành tích lũy khi kết hợp với OVER (… ORDER BY …):

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

Đối với mỗi hàng, SUM tính tổng tất cả các hàng trong phân vùng lên đến điểm đó, theo ORDER BY của cửa sổ. Kết quả là "cân bằng chạy" cổ điển.

Hãy thử nó

tập thể dục#sql.m7.l3.e1
Nỗ lực: 0Đang tải…

Đối với mỗi đơn hàng, hãy hiển thị id, customer_id, order_at và cột Days_from_previous là số ngày (có FLOOR) giữa đơn hàng hiện tại và đơn hàng trước đó của cùng một khách hàng, được đặt hàng theo order_at. NULL nếu không có đơn hàng trước đó. Đặt hàng theo customer_id và order_at.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BY order_at) trả về dấu thời gian của đơn hàng trước đó của khách hàng. Trừ đi để có INTERVAL, sau đó chuyển đổi thành ngày.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m7.l3.e2
Nỗ lực: 0Đang tải…

Đối với mỗi đơn hàng đã giao (trạng thái = 'đã giao'), id hiển thị, customer_id, order_at, order_total (tổng số lượng * đơn_giá của các mục hàng) và Running_total (tổng số đang chạy cho mỗi khách hàng, được đặt hàng theo order_at). Sử dụng CTE cho order_total. Đặt hàng theo customer_id và order_at.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

CTE tính tổng số tiền cho mỗi đơn hàng; SUM OVER tạo ra tổng số tiền hiện có cho mỗi khách hàng theo thời gian.

Giải pháp khả dụng sau 3 lần thử