2013-02-24 12 views
5

mam poniżej prostej tabeli BIRDCOUNT, pokazując ile ptaki były liczone w danym dniu:Mysql stworzyć dystrybucję Freqency

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

chciałbym utworzyć wykres rozkładu częstotliwości, pokazując, ile razy liczba ptaki zostały policzone. Więc potrzebuję MySQL, aby stworzyć coś takiego:

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

Jeśli ustalono liczbę zliczeń ptaków, byłoby to łatwe. Jednak nigdy nie znam min/max ilu ptaków. Potrzebuję więc instrukcji select, która:

  1. Tworzy wyjście podobne do powyższego, zawsze tworząc 10 zakresów zliczeń.
  2. (bardziej zaawansowane) Tworzy wydruki podobne do powyższych, zawsze tworząc N zakresów zliczeń.

Nie wiem, czy # 2 jest możliwe w jednym wyborze, ale czy ktoś może rozwiązać # 1?

+0

Do tej pory znalazłem min & max w jednym wyborze, a następnie podzielono na N zakresów, skonstruowałem instrukcję SELECT w PHP, tworząc zakresy programowo, a następnie uruchamiając drugi wybór. To naprawdę nie pomaga nikomu znaleźć odpowiedzi, ale ponieważ pytasz. – TSG

+0

Czy możesz podać te same dane przykładowe i jaki chcesz wynik? –

+0

a jeśli bird_count = 200, do którego rzędu będzie? –

Odpowiedz

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) 

Tu masz odpowiedź na oba Twoje pytania;] z różnicą, że początek i koniec zakresu są w oddzielnych kolumnach zamiast łączone, ale jeśli jest to potrzebne w jednej kolumnie Myślę, że można to zrobić tutaj. Aby zmienić liczbę zakresów, po prostu edytuj numer 10 Możesz znaleźć w pod-zapytaniu.

+0

To wygląda obiecująco (jeszcze nie testowane). Zakładam, że GRUPA wymusi liczenie na sumę dla każdego zakresu (np. WHERE> = range_start i <= range_end) ... – TSG

+0

Co stanie się, jeśli nie będzie żadnych ptaków liczonych w jednym zakresie? Zakładam, że nie utworzy on wiersza wyjściowego (tj. Bez wiersza z liczbą ptaków równą 0). – TSG

+0

Nie będzie. Myślenie o tym Możesz spróbować z zewnętrznego sprzężenia, będę edytować odpowiedź z przykładem w kilka minut. Trudno będzie używać tylko sql, jeśli potrzebujesz dynamicznej liczby zakresów. – Gustek

0

jestem domyślać się rzeczywistą zapytania SQL:

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

Jeśli tak, wszystko co musisz zrobić, to "bin" Twoje liczy:

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 

przyznane, jeśli jeden z zakresów brakuje, nie dostaniesz pasującego wiersza - ale możesz to łatwo rozwiązać za pomocą LEFT JOIN, jeśli to jest problem.

0

Podczas tworzenia czegoś takiego GROUP BY jest Twoim przyjacielem. Podstawową ideą jest umieszczenie każdej wartości w wiadrze, a następnie policzenie liczby elementów w każdym wiadrze. Aby utworzyć zasobnik, należy zdefiniować funkcję, która pobiera wartość i oblicza unikalną wartość dla zasobnika.

coś takiego:

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; 

W tym przypadku można zdefiniować funkcję, która podjęcia liczbę ptaków, i obliczyć dolny zakres wiadra. Następnie zgrupujesz wszystkie wartości w dolnym zakresie, co spowoduje umieszczenie, na przykład, 123 i 145 w wiadrze oznaczonym "100", a 234 i 246 w wiadrze oznaczonym "200".

Teraz każda wartość jest umieszczana w wiadrze, a wartości można pogrupować według etykiety segmentów i zliczać liczbę elementów w każdym wiadrze.

+0

Nie znasz najwyższej i najniższej liczby ptaków, więc Twoje rozwiązanie stworzy dużą liczbę zakresów (każdy o rozmiarze 100). – TSG

+0

Niezupełnie, to po prostu utworzy pojemniki dla wartości, które faktycznie znajdują się w tabeli. –