Оператор SQL Select, чтобы найти уникальную запись, основанную на множестве атрибутов - PullRequest
0 голосов
/ 02 ноября 2010

Чтобы поместить эту работу в контекст ... Я пытаюсь отфильтровать базу данных объектов и построить описания, которые могут быть озвучены для речевого интерфейса. Чтобы свести к минимуму описания, я хочу найти кратчайший способ описания объекта, основанный на идее 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), это было бы здорово. Я предполагаю, что (б) потребует (а) для всех комбинаций полей, но я не уверен, есть ли лучший способ.

Заранее спасибо за любую помощь в этом ....

1 Ответ

1 голос
/ 03 ноября 2010

Мне нравится идея атаковать проблему, используя язык общего назначения, например C #:

1) Выполните итерацию и посмотрите, есть ли у какого-либо атрибута 1 уникальный, например, ID = 4, который уникален, так как высота равна 7. Извлеките ID 4 из коллекции «running» и поместите в коллекцию «done» атрибут

Используйте инструмент модульного тестирования, например, MSUNIT, чтобы доказать вышеуказанные работы

2) Попробуйте и распространите аттибуты

Модульный тест

3) Посмотрите, может ли любой быть уникальным с 2 атрибутами. Извлеките эти идентификаторы из пары атрибутов

Модульный тест

4) Расширить до m атрибутов

Модульный тест

3) Рефакторинг, возможно, с использованием рекурсии

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...