Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mô phỏng chức năng lag trong MySQL

Đây là bản hack MySQL yêu thích của tôi.

Đây là cách bạn mô phỏng hàm lag:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote giữ giá trị của báo giá hàng trước. Đối với hàng đầu tiên @quot là -1.
  • curr_quote giữ giá trị của báo giá của hàng hiện tại.

Ghi chú:

  1. order by ở đây mệnh đề quan trọng giống như nó trong một hàm thông thường.
  2. Bạn cũng có thể muốn sử dụng độ trễ cho company chỉ để đảm bảo rằng bạn đang tính toán sự khác biệt trong các báo giá của cùng một company .
  3. Bạn cũng có thể triển khai bộ đếm hàng theo cách tương tự @cnt:[email protected]+1

Điều thú vị về lược đồ này là về mặt tính toán rất gọn nhẹ so với một số cách tiếp cận khác như sử dụng các hàm tổng hợp, các thủ tục được lưu trữ hoặc xử lý dữ liệu trong máy chủ ứng dụng.

CHỈNH SỬA:

Bây giờ đến với câu hỏi của bạn về việc nhận được kết quả ở định dạng bạn đã đề cập:

SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;

Việc lồng nhau không liên quan đến nhau nên không quá tệ (về mặt tính toán) như vẻ ngoài của nó (về mặt cú pháp) :)

Hãy cho tôi biết nếu bạn cần bất kỳ trợ giúp nào về việc này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tích hợp MySQL với Python trong Windows

  2. SQLite INSERT - TRÊN CẬP NHẬT KHÓA DUPLICATE (UPSERT)

  3. Tạo một chỉ mục trên một bảng sản xuất MySQL khổng lồ mà không cần khóa bảng

  4. cấp quyền truy cập từ xa cơ sở dữ liệu MySQL từ bất kỳ địa chỉ IP nào

  5. MySQL có bỏ qua các giá trị null trên các ràng buộc duy nhất không?