我有一个对象表,其中包含与之关联的值。该值取决于用于计算它的模型。
为了建模这种关系,我创建了一个具有以下模式的连接表:
CREATE TABLE object_value
(
object_id integer NOT NULL,
model character varying(20) NOT NULL,
value integer,
CONSTRAINT object_value_pkey PRIMARY KEY (object_id, model),
CONSTRAINT object_value_object_id_fkey FOREIGN KEY (leg_id)
REFERENCES object (id) MATCH SIMPLE
)
一些示例数据:
object_id; model; value
116288;"model_2.2.3";7028
116288;"model_2.2.4";7028
116289;"model_2.2.3";5535
116289;"model_2.2.4";5530
116290;"model_2.2.3";3529
116290;"model_2.2.4";3530
我一直在查询此表,以寻找模型计算的差异,如下所示:
SELECT DISTINCT ON (object_id) *
FROM object_value AS a INNER JOIN object_value AS b USING(object_id)
WHERE a.value!=b.value;
这一直很好,因为我只有两个不同的模型,但是当从第三个模型版本添加数据时,查询将无法正常工作。在添加第四个模型时,再次将表格与自己联系起来会给我带来同样的问题。
在我没想到的行之间是否有不同的比较值的概念?
答案 0 :(得分:2)
您可以使用聚合选择一行中的差异,例如:
insert into object_value values -- third model added
(116290, 'model_2.2.5', 3600);
select
object_id,
string_agg(model, ' : ') as model,
string_agg(value::text, ' : ') as value
from object_value
group by 1
order by 1
object_id | model | value
-----------+-----------------------------------------+--------------------
116288 | model_2.2.3 : model_2.2.4 | 7028 : 7028
116289 | model_2.2.3 : model_2.2.4 | 5535 : 5530
116290 | model_2.2.3 : model_2.2.4 : model_2.2.5 | 3529 : 3530 : 3600
(3 rows)
答案 1 :(得分:2)
如果要查找模型值不同的对象,请使用聚合,而不是连接:
select ov.object_id
from object_value ov
group by ov.object_id
having min(ov.value) <> max(ov.value);
如果要查看模型和/或值列表,可以使用string_agg()
。如果要查看所有详细信息,则使用窗口函数的类似查询应该有效:
select ov.*
from (select ov.*,
min(ov.value) over (partition by object_id) as minvalue,
max(ov.value) over (partition by object_id) as maxvalue
from object_value ov
) ov
where minvalue <> maxvalue;