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
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":
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".
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 …):
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ó
Đố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.
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
Đố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.
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ử