来自表或视图的row_number()?

时间:2014-03-08 22:58:43

标签: sql postgresql sql-view row-number

CREATE OR REPLACE VIEW public."masterx" AS 
 SELECT row_number() OVER (ORDER BY st_distance(t1.geom, t2.geom)) AS rownum,
    t1.id_seq,
    t2.pars_id,
    st_distance(t1.geom, t2.geom) AS mesafe
   FROM kadas t2,v7 t1
  WHERE st_dwithin(t2.geom, t1.geom, 400::double precision) = true
  AND t1.datex > ('now'::text::date - '180 days'::interval);

它创建一个视图。当我使用select from table时它给出了一个结果但是当我从上面的视图中选择时没有结果。有什么问题?

表t1是

id_seq|field a | field b| geom|

表2是

id| field x  | field y | geom|

我想加入两个带有geom列的表(两个点)。 __

SELECT row_number() OVER (ORDER BY st_distance(t1.geom, t2.geom)) AS rownum,
    t1.id_seq,
    t2.id,
    st_distance(t1.geom, t2.geom) AS distance
   FROM table2 t2,table1 t1
  WHERE st_dwithin(t2.geom, t1.geom, 400::double precision) = true 

如果我尝试选择:

where t2.id= 12345

给出结果1秒钟。

但是当我使用

create view as x (
SELECT row_number() OVER (ORDER BY st_distance(t1.geom, t2.geom)) AS rownum,
        t1.id_seq,
        t2.id,
        st_distance(t1.geom, t2.geom) AS distance
       FROM table2 t2,table1 t1
      WHERE st_dwithin(t2.geom, t1.geom, 400::double precision) = true 
)

母鸡尝试查询此视图没有结果。 有什么问题?

似乎rownumber在这里是问题,但为什么

__

表1 v7有2个milyon行 表2 kadas t2有1个milyon行。

select * from masterx.  
where  pars_id =422328447  

哪里没有解决方案。
我想做的是: 选择t1中位于400米内t2点的缓冲区中的点并按距离排序。这里没有问题,但是当我尝试按行距离来限制查询100个第一行时,它会使db和comp发疯并且没有解决方案**

1 个答案:

答案 0 :(得分:1)

不确定,但我会像这样简化CREATE语句:

CREATE OR REPLACE VIEW public.masterx AS 
SELECT row_number() OVER (ORDER BY st_distance(t1.geom, t2.geom)) AS rownum,
       t1.id_seq,
       t2.pars_id,
       st_distance(t1.geom, t2.geom) AS mesafe
FROM   v7    t1
JOIN   kadas t2 ON st_dwithin(t1.geom, t2.geom, 400::float8)
WHERE  t1.datex > (now()::date - 180)
ORDER  BY 1;

'now'是一个常量,我假设你想要函数now()。 Per documentation

  

提示:在指定'now'时,您不想使用第三种形式(DEFAULT)   创建表时的子句。系统现在将转换为   解析常量时的时间戳,以便默认时   需要值,将使用表创建的时间!

您可以从integer中减去date 而且您不应该依赖从窗口函数派生的排序顺序。添加明确的ORDER BY

呼叫:

SELECT * FROM public.masterx

性能

你有100万x 200万行。那是2,000,000,000,000种可能的组合。您的条件t1.datex > (now()::date - 180)会稍微减少一方,但巨大的号码将会保留。 geom列上的适当索引对此有很大帮助。这可以解释为什么, 条件

where t2.id = 12345

..只需1秒钟。您已将操作减少了100万。没有这个条件,它需要〜 100万次 ......