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

Sử dụng MEDIAN cùng với các hàm MAX, MIN và AVG trong MySQL

Bạn có thể tính giá trị trung bình với GROUP BY trong MySQL mặc dù không có hàm trung bình nào được tích hợp sẵn.

Xem xét bảng:

Acrington   200.00
Acrington   200.00
Acrington   300.00
Acrington   400.00
Bulingdon   200.00
Bulingdon   300.00
Bulingdon   400.00
Bulingdon   500.00
Cardington  100.00
Cardington  149.00
Cardington  151.00
Cardington  300.00
Cardington  300.00

Đối với mỗi hàng, bạn có thể đếm số lượng các mặt hàng tương tự ít hơn. Bạn cũng có thể đếm có bao nhiêu giá trị nhỏ hơn hoặc bằng:

name        v       <   <=
Acrington   200.00  0   2
Acrington   200.00  0   2
Acrington   300.00  2   3
Acrington   400.00  3   4
Bulingdon   200.00  0   1
Bulingdon   300.00  1   2
Bulingdon   400.00  2   3
Bulingdon   500.00  3   4
Cardington  100.00  0   1
Cardington  149.00  1   2
Cardington  151.00  2   3
Cardington  300.00  3   5
Cardington  300.00  3   5

Với truy vấn

SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
             , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
  FROM sale o

Giá trị trung bình sẽ xảy ra khi số lượng nhỏ hơn hoặc bằng một nửa số mục

  • Acrington có 4 mặt hàng. Một nửa trong số này là 2 trong phạm vi 0..2 (tương ứng với 200,00) và cũng trong phạm vi 2..3 (tương ứng với 300,00)

  • Bullingdon cũng có 4 mục. 2 nằm trong phạm vi 1..2 (giá trị 300,00) và 2..3 (giá trị 400,00)

  • Cardington có 5 mục. Giá trị 2,5 nằm trong khoảng từ 2 đến 3 tương ứng với Cardington 151.

Giá trị trung bình là giá trị trung bình của các giá trị tối thiểu và tối đa được trả về bởi:

SELECT cs.name,v
   FROM
   (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                 , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
      FROM sale o) cs JOIN
   (SELECT name,COUNT(1)*.5 as cn
      FROM sale
      GROUP BY name) cc ON cs.name=cc.name
 WHERE cn between ls and lse

Điều này mang lại:

Acrington   200.00
Acrington   200.00
Acrington   300.00
Bulingdon   300.00
Bulingdon   400.00
Cardington  151.00

Cuối cùng, chúng ta có thể nhận được giá trị trung bình:

SELECT name,(MAX(v)+MIN(v))/2 FROM
(SELECT cs.name,v
   FROM
   (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                 , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
      FROM sale o) cs JOIN
   (SELECT name,COUNT(1)*.5 as cn
      FROM sale
     GROUP BY name) cc ON cs.name=cc.name
 WHERE cn between ls and lse
 ) AS medians
GROUP BY name

Cho

Acrington   250.000000
Bulingdon   350.000000
Cardington  151.000000


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql nhóm khác nhau bởi trong một truy vấn

  2. python:làm thế nào để nhận thông báo cho các thay đổi cơ sở dữ liệu mysql?

  3. Đặt trường để tự động chèn dấu thời gian khi CẬP NHẬT?

  4. đồng hồ đo thời gian ping mã - điều này có thực sự đúng?

  5. Tạo truy vấn động trong MySQL thủ tục được lưu trữ