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