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发疯并且没有解决方案**
答案 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万次 ......