比较行之间的值

时间:2015-10-08 10:26:57

标签: sql postgresql

我有一个对象表,其中包含与之关联的值。该值取决于用于计算它的模型。

为了建模这种关系,我创建了一个具有以下模式的连接表:

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;   

这一直很好,因为我只有两个不同的模型,但是当从第三个模型版本添加数据时,查询将无法正常工作。在添加第四个模型时,再次将表格与自己联系起来会给我带来同样的问题。

在我没想到的行之间是否有不同的比较值的概念?

2 个答案:

答案 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;