2011-12-26 27 views
6
[tbl_votes] 
- id <!-- unique id of the vote) --> 
- item_id <!-- vote belongs to item <id> --> 
- vote <!-- number 1-10 --> 

Dĩ nhiên chúng ta có thể khắc phục điều này bằng cách:Làm thế nào tôi có thể trả về dữ liệu hộp số của tất cả các kết quả bằng cách sử dụng 1 truy vấn mySQL?

  • các smallest observation (như vậy)
  • các lower quartile (LQ)
  • các median (tôi)
  • các upper quartile (UQ)
  • largest observation (lo)

.. từng người một bằng nhiều truy vấn nhưng tôi tự hỏi nếu nó có thể được thực hiện với một truy vấn đơn lẻ.

Trong Oracle tôi có thể sử dụng COUNT OVERRATIO_TO_REPORT, nhưng điều này không được hỗ trợ trong mySQL.

Đối với những người không biết những gì một boxplot là: http://en.wikipedia.org/wiki/Box_plot

Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Xem http: // stackoverflow.com/questions/1057027/calculating-percentile-rank-in-mysql –

+0

Đó là một giải pháp rất bẩn nếu bạn hỏi tôi .. –

Trả lời

0

Dưới đây là một ví dụ về tính toán của các nhóm theo e256 dãy giá trị trong vòng e32 nhóm, một chỉ mục trên (E32, E256) trong trường hợp này là điều bắt buộc:

SELECT 
    @group:=IF([email protected], e32, GREATEST(@index:=-1, e32)) as e32_, 
    MIN(e256) as so, 
    MAX(IF(lq_i=(@index:[email protected]+1), e256, NULL)) as lq, 
    MAX(IF([email protected], e256, NULL)) as me, 
    MAX(IF([email protected], e256, NULL)) as uq, 
    MAX(e256) as lo 
FROM (SELECT @index:=NULL, @group:=NULL) as init, test t 
JOIN (
    SELECT e32, 
    COUNT(*) as cnt, 
    (COUNT(*) div 4) as lq_i, -- lq value index within the group 
    (COUNT(*) div 2) as me_i, -- me value index within the group 
    (COUNT(*) * 3 div 4) as uq_i -- uq value index within the group 
    FROM test 
    GROUP BY e32 
) as cnts 
USING (e32) 
GROUP BY e32; 

Nếu không có nhu cầu ở nhóm , truy vấn sẽ đơn giản hơn một chút.

P.S. test là bảng sân chơi của tôi có các giá trị ngẫu nhiên trong đó e32 là kết quả của Python int(random.expovariate(1.0) * 32), v.v.

2

Tôi đã tìm thấy một giải pháp trong PostgreSQL bằng cách sử dụng PL/Python.

Tuy nhiên, tôi để câu hỏi mở trong trường hợp ai đó đưa ra giải pháp trong mySQL.

CREATE TYPE boxplot_values AS (
    min  numeric, 
    q1  numeric, 
    median numeric, 
    q3  numeric, 
    max  numeric 
); 

CREATE OR REPLACE FUNCTION _final_boxplot(strarr numeric[]) 
    RETURNS boxplot_values AS 
$$ 
    x = strarr.replace("{","[").replace("}","]") 
    a = eval(str(x)) 

    a.sort() 
    i = len(a) 
    return (a[0], a[i/4], a[i/2], a[i*3/4], a[-1]) 
$$ 
LANGUAGE 'plpythonu' IMMUTABLE; 

CREATE AGGREGATE boxplot(numeric) (
    SFUNC=array_append, 
    STYPE=numeric[], 
    FINALFUNC=_final_boxplot, 
    INITCOND='{}' 
); 

Ví dụ:

SELECT customer_id as cid, (boxplot(price)).* 
FROM orders 
GROUP BY customer_id; 

    cid | min | q1 | median | q3 | max 
-------+---------+---------+---------+---------+--------- 
    1001 | 7.40209 | 7.80031 | 7.9551 | 7.99059 | 7.99903 
    1002 | 3.44229 | 4.38172 | 4.72498 | 5.25214 | 5.98736 

Nguồn: http://www.christian-rossow.de/articles/PostgreSQL_boxplot_median_quartiles_aggregate_function.php

0

Vâng, tôi có thể làm điều đó trong hai câu truy vấn. Thực hiện truy vấn đầu tiên để nhận vị trí của các phần tư và sau đó sử dụng chức năng giới hạn để nhận câu trả lời trong truy vấn thứ hai.

mysql> chọn (chọn tầng (count (*)/4)) như first_q, (chọn tầng (count (*)/2) từ customer_data) làm mid_pos, (chọn tầng (đếm (*)/4 * 3) từ customer_data) dưới dạng thứ ba_q từ đơn đặt hàng của khách hàng theo giới hạn đo lường 1;

mysql> chọn min (measure), (chọn đo từ thứ tự customer_data bằng cách đo giới hạn 0,1) như firstq, (chọn đo từ thứ tự customer_data bằng giới hạn đo 5,1) làm trung bình, (chọn số đo từ thứ tự customer_data bằng cách đo giới hạn 8,1) như last_q, max (measure) từ customer_data;

+0

Bạn đang sử dụng các vị trí truy vấn đầu tiên trong truy vấn thứ hai của mình như thế nào? – Naveen

Các vấn đề liên quan