Чтобы поместить эту работу в контекст ... Я пытаюсь отфильтровать базу данных объектов и построить описания, которые могут быть озвучены для речевого интерфейса. Чтобы свести к минимуму описания, я хочу найти кратчайший способ описания объекта, основанный на идее Grices Maxims.
Это возможно в коде, перебирая записи и проходя все перестановки, но я продолжаю думать, что должен быть способ сделать это в SQL ... пока я не нашел его. (Я использую PostGRES.)
Итак, у меня есть таблица, которая выглядит примерно так:
id colour position height
(int) (text) (text) (int)
0 "red" "left" 9
1 "red" "middle" 8
2 "blue" "middle" 8
3 "blue" "middle" 9
4 "red" "left" 7
Есть две вещи, которые я хотел бы найти на основе атрибутов (за исключением идентификатора).
а) являются ли какие-либо записи уникальными, основываясь на минимальном количестве атрибутов?
=> например запись 0 уникальна по цвету и высоте
=> например запись 1 является единственным красным элементом в середине
=> например запись 4 является уникальной, поскольку она имеет высоту 7
б) Чем конкретная запись уникальна?
=> например Как уникальна запись 0? потому что это единственный элемент с красным цветом и высотой 9
=> например запись 4 уникальна, потому что это единственный элемент с высотой 7
Конечно, может быть, что никакие объекты не являются уникальными в зависимости от атрибутов, что хорошо.
+++++++++++++++++++++++++
Ответ (а)
Таким образом, единственный способ, которым я могу сделать это в SQL, - это начать с тестирования одного атрибута, чтобы увидеть, есть ли одно совпадение из всех записей. Если нет, то добавьте атрибут 2 и протестируйте снова. Затем попробуйте атрибуты 1 и 3. Наконец, попробуйте атрибуты 1,2 и 3.
Примерно так: -
тест с одним столбцом:
select * from griceanmaxims
where height=(Select height from griceanmaxims
group by height
having (count(height)=1))
or
relpos=
(Select relpos
from griceanmaxims
group by relpos
having (count(relpos)=1))
or
colour=
(Select colour
from griceanmaxims
group by colour
having (count(colour)=1))
тесты с двумя столбцами:
(Select colour,relpos
from griceanmaxims
group by colour,relpos
having (count(colour)=1))
(Select colour,height
from griceanmaxims
group by colour,height
having (count(colour)=1))
etc
++++++++
Я не уверен, есть ли лучший способ или как объединить результаты тестов с двумя столбцами.
Также, если у кого-то есть какие-либо предложения о том, как определить отличительные факторы для записи (как в вопросе b), это было бы здорово. Я предполагаю, что (б) потребует (а) для всех комбинаций полей, но я не уверен, есть ли лучший способ.
Заранее спасибо за любую помощь в этом ....