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

Thay đổi: LAG và LEAD

Thay đổi: LAG và LEAD

Trong dữ liệu tuần tự và dựa trên thời gian, bạn thường cần so sánh hàng hiện tại với hàng của ngày hôm trước. Trong SQL "tiêu chuẩn", làm như vậy đòi hỏi phải tự tham gia rất nguy hiểm (và rất chậm).

Các hàm LAG() (hàng trước) và LEAD() (hàng tiếp theo) giải quyết chính xác vấn đề này một cách cực kỳ linh hoạt và tinh tế.

Nhìn về quá khứ và tương lai

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

Trong ví dụ, mỗi hàng sẽ mang số lượng được tạo ra bởi cùng một bảng một cách thuận tiện, được dịch chuyển về phía trước một hàng (ngược thời gian). Chúng ta có thể dễ dàng trừ total_amount - LAG(...) để tính toán chênh lệch hoặc phần trăm thay đổi hàng tháng!

Tương tự, LEAD() sẽ lấy giá trị từ hàng ngay bên dưới hàng hiện tại.

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

Từ bảng 'sản phẩm', hãy trích xuất 'id', 'launched_on', 'price' và thêm 'prev_price', tức là 'giá' của sản phẩm được coi là giá trị 'trước đó' một cách hợp lý, theo thứ tự 'launched_on' tăng dần.

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

Sử dụng LAG(giá) QUÁ(ORDER BY ra mắt_on ASC)

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

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

Bạn sẽ tính toán mức tăng xếp hạng cho mỗi người dùng cá nhân như thế nào? Mô phỏng nó: từ bảng 'đánh giá' trích xuất 'customer_id', 'created_at', 'xếp hạng' và 'next_rated' (đánh giá tiếp theo của cùng một khách hàng theo thời gian). Vì vậy, hãy phân vùng theo 'customer_id', sắp xếp theo 'created_at' và sử dụng chức năng cửa sổ bên phải để xem trước.

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

LEAD() cùng với PARTITION BY và ORDER BY trong OVER.

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