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

Mysql có tương đương với các chức năng phân tích của Oracle không?

chỉ muốn nói với bạn rằng bạn có thể sử dụng các biến trong MySQL để bắt chước các hàm phân tích. Ví dụ, SUM OVER có thể được thực hiện như sau:


SELECT amount, 
    @sum := @sum + amount as sum 
FROM tbl
JOIN (SELECT @sum := 0) s

Nếu bạn muốn PARTITION BY , nó có thể nhưng phức tạp hơn một chút. Về cơ bản, bạn thêm một @variable khác để xem tài khoản (hoặc bất cứ thứ gì bạn muốn phân vùng), sắp xếp theo tài khoản (hoặc biến của bạn), rồi đặt lại @sum khi tài khoản thay đổi. Như sau:


SELECT account, 
    amount, 
    (case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
    (case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a

Bạn sẽ lưu ý hai thay đổi lớn phải được thực hiện để đạt được hiệu ứng phân vùng:

  1. Bảng chính (tbl ) được bao bọc trong một lựa chọn phụ với ORDER BY mệnh đề. Điều này là cần thiết vì khi MySQL thực hiện @account kiểm tra biến các giá trị cần phải được sắp xếp. Nếu điều này không xảy ra, bạn sẽ nhận được các giá trị tổng cũng như giá trị tài khoản không chính xác.

  2. Có một cột 'bổ sung' được đặt bí danh as _ . Bạn có thể bỏ qua cột này khi sử dụng kết quả, nhưng thứ tự của @account cần kiểm tra và thay đổi sau @sum kiểm tra và thay đổi.

    Cũng với điều này, bạn có thể chọn sắp xếp lại các cột của mình nếu bạn không ngại tài khoản là cuối cùng. Điều này được thực hiện bằng cách lấy ra account đầu tiên vì nó trùng lặp với _ cuối cùng và sau đó rõ ràng được đổi tên thành bí danh _ vào tài khoản account .

Tài nguyên:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hướng dẫn xếp hạng sao jquery bằng php và mysql

  2. Hàm MySQL DEGREES () - Chuyển đổi từ Radian sang Độ

  3. Làm thế nào để xóa hàng mysql sau khi thời gian trôi qua?

  4. Tạo một bảng tạm thời trong một câu lệnh SELECT mà không có một bảng CREATE TABLE riêng biệt

  5. Tôi có một mảng các số nguyên, làm cách nào để sử dụng từng số nguyên trong truy vấn mysql (trong php)?