postgreSQL 窗口函数,用于对选定距离内的值进行分组



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)

最新更新