2015-10-08 2 views
1

У меня есть таблица объектов, у которой есть значения, связанные с ней. Значение зависит от того, какая модель используется для ее расчета.Сравнение значений между строками

Для модели это соотношение я создал таблицу соединений со следующей схемой:

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

_when добавления данных из третьей версии модели запрос не будет работать, как intended_, нужно больше разъяснений по этому поводу? –

+0

Откуда берется 'leg_alertness'? –

+0

Это была ошибка копирования/вставки, она должна быть object_value. – monostop

ответ

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) 
+0

Спасибо! Я объединил ваш ответ с предоставлением предложения gordon-linoff, который мне нужен! – monostop

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; 
+0

Отлично! Я закончил с использованием следующих действий, чтобы получить меня, что я высокоточного хочу: выберите object_id, string_agg (модель, ': ') в качестве модели, string_agg (значение :: текст,':') в качестве значения из object_value group by object_id, имеющий min (значение) <> max (значение); – monostop

Смежные вопросы