首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql创建频率分布

Mysql创建频率分布
EN

Stack Overflow用户
提问于 2013-02-24 19:18:07
回答 4查看 6.8K关注 0票数 10

下面我有一张简单的桌子,上面显示了每一天有多少只鸟被计算在内:

代码语言:javascript
复制
+----------+
| NUMBIRDS |
+----------+
| 123      |
| 573      |
| 3        |
| 234      |
+----------+

我想要创建一个频率分布图,显示多少次的鸟类被计数。所以我需要MySQL来创建这样的东西:

代码语言:javascript
复制
+------------+-------------+
| BIRD_COUNT | TIMES_SEEN  |
+------------+-------------+
| 0-99       | 17          |
| 100-299    | 23          |
| 200-399    | 12          |
| 300-499    | 122         |
| 400-599    | 3           |
+------------+-------------+

如果鸟的计数范围是固定的,这将是容易的。然而,我从来不知道有多少只鸟被看见了。所以我需要一个select语句:

  1. 创建与上面类似的输出,始终创建10个计数范围。
  2. (更高级)创建类似于上面的输出,总是创建N个计数范围。

我不知道在一个选择中#2是否可行,但是谁能解决#1呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-24 21:52:52

代码语言:javascript
复制
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 )

在这里,您对两个问题都有答案;]由于差异,范围的开始和结束是在单独的列中,而不是串联的,但是如果您需要在一列中,我想您可以从这里开始。要更改范围的数量,只需编辑数字10,您可以在子查询中找到。

票数 8
EN

Stack Overflow用户

发布于 2013-02-24 20:43:23

当你做这样的事情时,你的朋友就是你的朋友。其基本思想是将每个值放入桶中,然后计算每个桶中的元素数。要创建一个桶,您可以定义一个函数,该函数接受该值并计算桶的唯一值。

就像这样:

代码语言:javascript
复制
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;

在本例中,您定义了一个函数,该函数接受鸟计数,并计算桶的较低范围。然后,将较低范围上的所有值分组,例如,将123和145放置到标有"100“的桶中,将234和246放置到标有"200”的桶中。

现在,每个值都放在一个桶中,您可以根据桶标签对值进行分组,并计算每个桶中的元素数。

票数 3
EN

Stack Overflow用户

发布于 2013-02-24 20:41:19

我猜您的实际SQL查询:

代码语言:javascript
复制
SELECT dateColumn, COUNT(*) AS NUMBIRDS
FROM birdTable
GROUP BY dateColumn

如果是这样的话,你所要做的就是把你的计数“倒掉”:

代码语言:javascript
复制
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

当然,如果其中一个区域丢失了,您将不会得到一个匹配的行--但是如果这是一个问题,您可以很容易地用左联接来解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15055540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档