我有一张非常简单的table:
CREATE TABLE IF NOT EXISTS LuxLog (
Sensor TINYINT,
Lux INT,
PRIMARY KEY(Sensor)
)
它包含来自不同传感器的数千个日志。
我想有q1和q3的所有传感器。
我可以对每个数据进行一次查询,但最好对所有传感器进行一次查询(从一次查询返回q1和q3)
我认为这将是一个相当简单的操作,因为四分位数被广泛使用,并且是频率计算中的主要统计变量之一。事实上,我发现了大量过于复杂的解决方案,而我希望找到一些简洁明了的解决方案。
谁能给我个提示?
编辑:这是我在网上找到的一段代码,但不适用于我:
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT( -- 1) make a sorted list of values
Lux
ORDER BY Lux
SEPARATOR ','
)
, ',' -- 2) cut at the comma
, 75/100 * COUNT(*) -- at the position beyond the 90% portion
)
, ',' -- 3) cut at the comma
, -1 -- right after the desired list entry
) AS `75th Percentile`
FROM LuxLog
WHERE Sensor=12
AND Lux<>0
我得到1作为返回值,而它应该是一个可以除以10的数字(10,20,30…..1000)
6条答案
按热度按时间wnvonmuf1#
请参见sqlfiddle:http://sqlfiddle.com/#!9/accca6/2/6注意:对于sqlfiddle,我已经生成了100行,1到100之间的每个整数都有一行,但是这是一个随机顺序(在excel中完成)。
代码如下:
编辑:
基本推理如下:对于四分位1,我们希望从顶部得到25%,因此我们想知道有多少行,即:
现在我们知道了行数,我们想知道25%的行数是多少,它是这一行:
然后为了找到一个四分位数,我们想按lux对luxlog表进行排序,然后得到行号“@quartile”,为了做到这一点,我们将偏移量设置为@quartile,表示我们想从行号@quartile开始选择,我们说limit 1表示我们只想检索一行。那是:
我们(几乎)对另一个四分位数也是这样,但是我们不是从顶部开始(从高值到低值),而是从底部开始(这解释了asc)。
但是现在我们只在变量@sql\uq1和@sql\uq3中存储了字符串,所以我们连接它们,合并查询结果,准备查询并执行它。
b0zn9rqh2#
使用ntile很简单,但它是postgres函数。你基本上就是这样做的:
下面是我在sqlfiddle上为您制作的一个简单示例:http://sqlfiddle.com/#!15/7f05a/1号机组
在mysql中,你可以使用rank。。。以下是sqlfiddle:http://www.sqlfiddle.com/#!2/d5587/1(来自下面链接的问题)
mysql rank()的用法来自这里回答的stackoverflow:mysql中的rank函数
寻找萨尔曼a的答案。
mv1qrgav3#
像这样的事情应该可以做到:
下面是完整的示例:
a64a0gku4#
或者你可以用这样的排名:
每四分位数只有一个记录:
edit:sqlfiddle示例(http://sqlfiddle.com/#!9/a14a4/17)拆下后看起来像这样
6ljaweal5#
这是我提出的一个计算四分位数的查询;它在~0.04s w/~5000个表行中运行。当我最终使用这些数据建立四个四分位范围时,我包括了最小值/最大值:
在这里摆弄:http://sqlfiddle.com/#!9/58c0e2/1号机组
当然存在性能问题;如果有人对如何改进这一点有意见,我很乐意。
样本数据列表:
示例查询输出:
gdx19jrr6#
我将此解决方案与mysql函数结合使用:
x是你想要的百分位数
数组\u值您的组\u concat值的顺序和分隔方式,
例子: