Getting data for histogram plot

前端 未结 10 687
花落未央
花落未央 2020-11-29 15:27

Is there a way to specify bin sizes in MySQL? Right now, I am trying the following SQL query:

select total, count(total) from faults GROUP BY total;
<         


        
相关标签:
10条回答
  • 2020-11-29 16:16

    Mike DelGaudio's answer is the way I do it, but with a slight change:

    select floor(mycol/10)*10 as bin_floor, count(*)
    from mytable
    group by 1
    order by 1
    

    The advantage? You can make the bins as large or as small as you want. Bins of size 100? floor(mycol/100)*100. Bins of size 5? floor(mycol/5)*5.

    Bernardo.

    0 讨论(0)
  • 2020-11-29 16:16

    That should work. Not so elegant but still:

    select count(mycol - (mycol mod 10)) as freq, mycol - (mycol mod 10) as label
    from mytable
    group by mycol - (mycol mod 10)
    order by mycol - (mycol mod 10) ASC
    

    via Mike DelGaudio

    0 讨论(0)
  • 2020-11-29 16:17

    Equal width binning into a given count of bins:

    WITH bins AS(
       SELECT min(col) AS min_value
            , ((max(col)-min(col)) / 10.0) + 0.0000001 AS bin_width
       FROM cars
    )
    SELECT tab.*,
       floor((col-bins.min_value) / bins.bin_width ) AS bin
    FROM tab, bins;
    

    Note that the 0.0000001 is there to make sure that the records with the value equal to max(col) do not make it's own bin just by itself. Also, the additive constant is there to make sure the query does not fail on division by zero when all the values in the column are identical.

    Also note that the count of bins (10 in the example) should be written with a decimal mark to avoid integer division (the unadjusted bin_width can be decimal).

    0 讨论(0)
  • 2020-11-29 16:21
    select "30-34" as TotalRange,count(total) as Count from table_name
       where total between 30 and 34
    union (
    select "35-39" as TotalRange,count(total) as Count from table_name 
       where total between 35 and 39)
    union (
    select "40-44" as TotalRange,count(total) as Count from table_name
       where total between 40 and 44)
    union (
    select "45-49" as TotalRange,count(total) as Count from table_name
       where total between 45 and 49)
    etc ....
    

    As long as there are not too many intervals, this is a pretty good solution.

    0 讨论(0)
提交回复
热议问题