2013-02-24 46 views
5

Tôi có một BIRDCOUNT bảng đơn giản dưới đây, cho thấy có bao nhiêu con chim được tính vào bất kỳ ngày nào:Mysql tạo phân phối freqency

+----------+ 
| NUMBIRDS | 
+----------+ 
| 123  | 
| 573  | 
| 3  | 
| 234  | 
+----------+ 

Tôi muốn tạo ra một biểu đồ phân phối tần số, cho thấy bao nhiêu lần một số chim được đếm. Vì vậy, tôi cần MySQL để tạo ra một cái gì đó như:

+------------+-------------+ 
| BIRD_COUNT | TIMES_SEEN | 
+------------+-------------+ 
| 0-99  | 17   | 
| 100-299 | 23   | 
| 200-399 | 12   | 
| 300-499 | 122   | 
| 400-599 | 3   | 
+------------+-------------+ 

Nếu phạm vi đếm chim được cố định, điều này sẽ dễ dàng. Tuy nhiên, tôi không bao giờ biết min/max của bao nhiêu con chim đã được nhìn thấy. Vì vậy, tôi cần một tuyên bố chọn rằng:

  1. Tạo đầu ra tương tự như trên, luôn tạo 10 phạm vi.
  2. (nâng cao hơn) Tạo đầu ra tương tự như trên, luôn tạo N phạm vi đếm.

Tôi không biết liệu # 2 có khả thi trong một lựa chọn duy nhất hay không nhưng ai cũng có thể giải quyết # 1?

+0

Cho đến nay tôi tìm thấy min & max trong một lựa chọn, và sau đó chia thành N phạm vi, xây dựng một câu lệnh SELECT trong PHP tạo các dãy theo chương trình, sau đó chạy lựa chọn thứ hai. Điều đó không thực sự giúp bất cứ ai đưa ra câu trả lời, nhưng kể từ khi bạn hỏi. – TSG

+0

bạn có thể cung cấp dữ liệu mẫu giống nhau và bạn muốn kết quả nào không? –

+0

và nếu bird_count = 200, hàng nào sẽ là? –

Trả lời

6
SELECT 
    FLOOR(birds.bird_count/stat.diff) * stat.diff as range_start, 
    (FLOOR(birds.bird_count/stat.diff) +1) * stat.diff -1 as range_end, 
    count(birds.bird_count) as times_seen 
FROM birds_table birds, 
    (SELECT 
     ROUND((MAX(bird_count) - MIN(bird_count))/10) AS diff 
    FROM birds_table 
    ) AS stat 
GROUP BY FLOOR(birds.bird_count/stat.diff) 

đây Bạn có câu trả lời cho cả hai câu hỏi của bạn;] với sự khác biệt mà bắt đầu và kết thúc của loạt là trong các cột riêng biệt thay vì nối nhưng nếu bạn cần nó trong một cột tôi đoán Bạn có thể làm điều đó từ đây. Để thay đổi số phạm vi chỉ cần chỉnh sửa số 10 Bạn có thể tìm thấy trong truy vấn phụ.

+0

Điều này có vẻ đầy hứa hẹn (chưa được thử nghiệm). Tôi giả định rằng GROUP sẽ buộc tổng số cho mỗi phạm vi (như WHERE> = range_start và <= range_end) ... – TSG

+0

Điều gì sẽ xảy ra nếu không có loài chim nào được tính trong bất kỳ phạm vi đơn lẻ nào? Tôi cho rằng nó sẽ không tạo ra một hàng đầu ra (nghĩa là không có hàng có số lượng chim là 0). – TSG

+0

Nó sẽ không. Suy nghĩ về nó Bạn có thể thử với tham gia bên ngoài, tôi sẽ chỉnh sửa câu trả lời với ví dụ sau vài phút. Sẽ khó sử dụng sql nếu bạn yêu cầu số phạm vi động. – Gustek

0

Tôi đoán tại truy vấn SQL thực tế của bạn:

SELECT dateColumn, COUNT(*) AS NUMBIRDS 
FROM birdTable 
GROUP BY dateColumn 

Nếu vậy, tất cả các bạn phải làm là "bin" đếm của bạn:

SELECT CONCAT_WS('-', 
    FLOOR(NUMBIRDS/100)*100, 
    ((FLOOR(NUMBIRDS/100)+1)*100) - 1 
) AS BIRD_COUNT 
,COUNT(*) AS TIMES_SEEN 
FROM (
    SELECT dateColumn, COUNT(*) AS NUMBIRDS 
    FROM birdTable 
    GROUP BY dateColumn 
) AS birdCounts 
GROUP BY BIRD_COUNT 

Cấp, nếu một trong các dãy bị thiếu, bạn sẽ không nhận được hàng phù hợp - nhưng bạn có thể dễ dàng giải quyết điều đó bằng LEFT JOIN nếu đó là vấn đề.

0

Khi tạo một cái gì đó như thế này, GROUP BY, là bạn của bạn. Ý tưởng cơ bản là đặt từng giá trị vào một nhóm và sau đó đếm số lượng phần tử trong mỗi nhóm. Để tạo nhóm, bạn xác định hàm nhận giá trị và tính giá trị duy nhất cho nhóm.

Something như thế này:

SELECT 
    @low := TRUNCATE(bird_count/100, 0) * 100 as Low, 
    TRUNCATE(@low + 99, 0) as High, 
    COUNT(*) AS Count 
FROM birds_seen 
GROUP BY Low; 

Trong trường hợp này, bạn định nghĩa một hàm lấy số lượng chim, và tính toán phạm vi dưới của thùng. Sau đó, bạn nhóm tất cả các giá trị trên phạm vi thấp hơn, nơi sẽ đặt, ví dụ, 123 và 145 vào thùng có nhãn "100" và 234 và 246 vào nhóm có nhãn "200".

Bây giờ, mỗi giá trị được đặt trong một nhóm và bạn có thể nhóm các giá trị theo nhãn nhóm và đếm số lượng phần tử trong mỗi nhóm.

+0

Bạn không biết số lượng chim cao nhất và thấp nhất, vì vậy giải pháp của bạn sẽ tạo một số lượng lớn phạm vi (mỗi kích thước 100). – TSG

+0

Không thực sự, nó sẽ chỉ tạo nhóm cho các giá trị thực sự có trong bảng. –

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