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
试试这个;这是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)