【发布时间】:2020-10-17 04:31:27
【问题描述】:
我有一个非常简单的表格:
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)
【问题讨论】:
-
你不是在几个小时前才问过这个问题吗?没有好的答案?
-
“我认为这将是一个相当简单的操作,因为四分位数被广泛使用,并且是频率计算中的主要统计变量之一。”这不是预测任务难易程度的一个很好的基础。与计算方法相比,计算四分位数(甚至只是中位数)在操作上比较复杂。
-
你说得对,但我现在正在接近 SQL,而且由于我习惯了其他高级编程语言,因此缺少统计包让我很痛苦。
-
SQL 没有很好地被描述为一种编程 语言。它是一种基于关系数据模型的数据定义和数据操作语言。尽管 SQL 通常以及某些实现确实具有一些针对排序的特性,但底层模型是基于(无序)集合的。这与某些类型的任务不匹配,例如计算四分位数。这并不意味着您不能在 SQL 中执行此类计算,但对于某些任务,您最好将 SQL 与另一种语言配对。
-
MySQL 恰好特别受限于此类任务,因为它缺少几个共同的功能,其中任何一个都可以使工作更容易(窗口函数、公共表表达式、各种其他特定功能——甚至无视
NTILE())。
标签: mysql sql quantile percentile