我在想一种方法来推理一个相当简单的问题:
表foo
有两列,id
有唯一标识符,value
有随机的numeric
值。给定一个常数threshold
值,找出value
在该阈值内的值组-该组的计数和该组的平均值。
下面是foo
表(在PostgreSQL中):
CREATE TABLE foo (
id serial PRIMARY KEY,
value numeric NOT NULL
);
字符串
查询应该返回计数和平均值-条目 * 不能 * 被重复计数,所以我希望行基于一些阈值“接近度”值被“切割成组”-你可以把threshold
值看作半径:
SELECT AVG(foo.value), COUNT(foo.id)
FROM foo
GROUP BY foo.value; -- where I'm stuck
型
上面的查询只会将聚合函数应用到foo.value
有exact重复的行-我想要的是类似于以下伪SQL的东西:
SELECT AVG(foo.value), COUNT(foo.id)
FROM foo
GROUP BY
(row_being_grouped.value <= foo.value + threshold)
AND
(row_being_grouped.value >= foo.value - threshold);
型
我不确定这是否有意义。我想知道我是否可以在不做子查询的情况下摆脱这种情况-也许在找到桶内的平均值之前以某种方式“桶”行?
1条答案
按热度按时间zwghvu4y1#
如果“阈值”可以理解为同一组的值之间允许的最大间隙,那么这是一个定义明确的gaps-and-islands问题。
下面是一个解决方案:
字符串
fiddle(带分步演示)
解释和链接到更多:
为了方便和简短的代码,我使用布尔逻辑(
true OR null
→true
,false OR null
→null
),以及count()
忽略null
值的事实。请参阅:如果这更多的是一个光栅/集群/颗粒/网格问题,你需要准确地定义哪些行选择为“焦点”,或者,独立光栅/网格的确切性质。