PostgreSQL中是否有一个函数可以对具有相似值的行进行分组?最好的是窗口函数,如ST_clusterDBSCAN,它将行放在选定的距离内。这是一个例子:
Group Value
A 1
A 2
A 2
A 5
A 6
A 10
B 1
B 3
我正在寻找功能,这会给我这样的结果。
SELECT group, value,
"FUNCTION"(value, 2) OVER (PARTITION BY group) cluster
FROM mytable
其中第二个参数(2)表示值之间的最大范围,可以在一个集群中。
Group Value Cluster
A 1 1
A 2 1
A 2 1
A 5 2
A 6 2
A 10 3
B 1 1
B 3 1
答案 0 :(得分:0)
尝试一下;这是dnoeth建议的方法。我将测试数据集称为“ temp”,并将组列重命名为“ agroup”。您可以通过更改不等式的右侧来更改阈值(所要查找的差异),并且可能需要更改真实数据中的排序。顺便说一句,范围无界声明是任何窗口的默认设置,因此并不是必须的,但是为了清楚起见,我将其保留了下来。
WITH step1 AS (
SELECT t.*, CASE WHEN (value - lag(value,1) OVER w) > 1 THEN 1 ELSE 0 END AS aflag
FROM temp t WINDOW w AS (ORDER BY agroup,value))
SELECT s.agroup,s.value,sum(aflag) OVER w2 + 1 AS cluster
FROM step1 s WINDOW w2 AS (PARTITION BY agroup ORDER BY agroup,value RANGE UNBOUNDED PRECEDING)