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

时间:2018-03-13 07:42:50

标签: sql postgresql postgis

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

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)