SQL: поиск повторяющихся записей в группе (с переменным количеством элементов) - PullRequest
3 голосов
/ 02 декабря 2011

У меня есть таблица групп (GROUPS), определенная group_id (PK) и некоторыми другими полями.Каждая группа может состоять из переменного количества элементов и их значений.Этот состав группы хранится во второй таблице (GROUP_COMPOSITION), которая имеет поле PK (счетчик), поле для group_id, поле для имени элемента и поле для значения имени элемента.

Например:

Table of groups:
groupId
g1
g2

Table of Group composition:

PK     groupID       Element_Name    Element_Value
1      g1            Material        A
2      g1            Temperature     37
3      g2            Color           white
4      g2            Temperature     50
5      g2            Material        B          
6      g3            Material        C
7      g4            Color           Red

Итак, если вы пытаетесь вставить «новую группу» (g5), определенную исключительно для Material = B и Color = white и Temperature = 50, я бы хотел идентифицировать ее как повторяющуюсяgroup (g2).

Я хотел бы предотвратить вставку дубликата «состав группы» во вторую таблицу, где состав группы определяется общим количеством элементов и их значений.

Ядумает о запросе INTERSECT для всех возможных элементов, которые будут вставлены, но не уверен, является ли это оптимальным способом.

Это связано с публикацией SQL для поиска дублирующихся записей (внутри группы) , но в этом случае критерии для поиска дубликатов вставки основывались на количестве элементов (не на их природе).

Я бы действительно оценил любую помощь

Спасибо

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Поскольку ваши данные, похоже, указывают на то, что для этих групп существует довольно стабильный диапазон свойств, почему бы не сделать их первоклассными гражданами, а перевести их в столбцы?

groupid | Material | Temperature | Color
--------+----------+-------------+-----------
g1      | A        | 37          | <null>
g2      | B        | 50          | White
g3      | C        | <null>      | <null>
g4      | <null>   | <null>      | Red

Это не будетслишком сложно динамически добавлять столбцы по мере необходимости, если вы так склонны, но мне немного любопытно, как вы хотите определить группу как «повторяющуюся»?Когда атрибуты новой группы имеют хотя бы один соответствующий атрибут в существующей группе?Если это так, запрос будет действительно простым:

select groupid from table where
Material=B and
Color=White

Если есть какие-либо возвращаемые строки, значит, у вас уже есть группа с хотя бы этими свойствами.

1 голос
/ 05 декабря 2011

Я думаю, я бы построил функцию и пошел бы по маршруту пересечения.Я думаю, вы могли бы также создать строку, чтобы связать каждую группу со значением, представляющим все данные группы.Затем примените ту же функцию к вашей группе кандидатов и проверьте соответствие элементов.Вот пример возможной аггегации Postgresql:

SELECT g.groupid, array_to_string(g.element_array, ',') elements
  FROM (SELECT o.groupid, array_agg(o.element_name ||'='|| o.element_value) AS element_array
      FROM (SELECT groupid, element_name, element_value
              FROM composition
              ORDER BY 1, 2) o
      GROUP BY groupid) g
  ORDER BY groupid


 groupid |          elements
---------+---------------------------------------
 g1      | Material=A,Temperature=37
 g2      | Color=white,Material=B,Temperature=50
 g3      | Material=C
 g4      | Color=Red

Внутренний порядок должен гарантировать, что он генерирует последовательно.Кажется, Oracle 11gR2 имеет функцию LISTAGG для конкатенации строк, которая может быть полезна.Или вы можете создать собственную агрегатную функцию для этого.Если эти данные относительно статичны, вы, возможно, захотите предварительно вычислить и сохранить при вставке, а не перегенерировать с каждым запросом.

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