如何计算包含sql中的点的矩形

时间:2015-12-20 09:38:57

标签: sql algorithm teradata

我在SQL(Teradata)中遇到以下问题。我在网格上给出了一系列(数千)重叠矩形。有没有一种有效的方法来存储矩形数据,这样,只使用SQL,我可以为每个点计算包含它的矩形的数量?在某些情况下,我们正在谈论成千上万的矩形和数百万点。一个小规模的例子:

在5x5网格上,在(1,1,4,4)和(2,2,5,5)处有两个矩形坐标(x1,y1,x2,y2),得到的矩阵

11110
12221个
12221个
01111

我如何使用sql计算?最终的数据格式是一个带有“x”“y”和“count”列的表,其中count表示矩阵中x,y的值

2 个答案:

答案 0 :(得分:1)

您可以将矩形存储在表格rects中,其中包含x1y1x2y2列,即两对列,一列对于每个坐标。对于给定的点(x,y),您可以检索包含它的矩形数:

SELECT COUNT(*) FROM rects WHERE x1 <= x AND x2 >=x AND y1 <= y AND y2 >= y

答案 1 :(得分:1)

抱歉,不熟悉Teradata,但通常你想要的是这种情况下的R-Tree,看起来Teradata支持它 - http://www.info.teradata.com/HTMLPubs/DB_TTU_14_10/index.html#page/SQL_Reference/B035_1181_112A/Introduction.117.18.html#ww15453925

然后你做这样的事情(伪代码):

CREATE TABLE rects (
 id integer primary key,
 box RECTANGLE,
 INDEX `idx_box` (box) USING GIST
);

SELECT * FROM rects where ST_CONTAINS(box, POINT(x, y));

如果矩形的最大尺寸有限且比整个区域小得多,那么像lex82的答案这样的简单方法可以很好地进行一些调整(再次,伪代码):

CREATE TABLE rects (
  id integer primary key,
  x1 <whatever your coordinate type is>,
  x2 ...
  y1 ...
  y2 ...,
  INDEX (x1, y1)
)

SELECT COUNT(*) FROM rects 
  WHERE 
       x1 BETWEEN (x - MAX_RECT_SIDE) AND X  -- These 2 to hit the index
   AND y1 BETWEEN (y - MAX_RECT_SIDE) AND y
   AND (x2 >= x) AND (y2 >= y)

这里的想法是,如果已知最大矩形并且足够小,那么您基本上有一个边界框用于使用简单的2列数字索引查找的矩形的左上角。