我有一个可以用多个线性段表示的模型,如下所示:
Y
| _/_________\_
| / \
| / \
| / \
|/ \
|
|________________________ X
我需要找到给定值X
的Y值我的首要问题是将每个细分受众群存储为关系line
类型{A,B,C}。但是,我不确定在找到正确的查询来检索Y值方面会给我带来什么。
答案 0 :(得分:1)
由于您正在处理线性段,因此应使用lseg
数据类型(line
数据类型表示无限长度的行)。以这种格式获得数据后,您可以在所需的X值处找到具有无限长度垂直线的线段的交集,并提取交叉点的Y值。
CREATE TABLE segments (id int, seg lseg);
INSERT INTO segments VALUES
(1, '[(4,3), (12,15)]'), -- positively inclined line segment
(2, '[(2,19), (24,-4)]'), -- negatively inclined line segment
(3, '[(4,3), (12,3)]'), -- horizontal line segment
(4, '[(5,3), (5,15)]'), -- vertical line segment, collinear at X=5
(5, '[(4,3), (4,15)]'); -- vertical line segment, no intersection at X=5
然后:
test=# SELECT id, 5 AS x, (seg # '((5,-999999999), (5,999999999))'::lseg)[1] AS y
test-# FROM segments;
id | x | y
----+---+------------------
1 | 5 | 4.5
2 | 5 | 15.8636363636364
3 | 5 | 3
4 | 5 |
5 | 5 |
(5 rows)
从上面可以明显看出,共线线段(即X的值相同的垂直线段)和没有交点的线段为Y返回NULL
。