При работе с SQL Server отношения множеств обычно просты. Однако, при работе с нечеткими отношениями множеств, все может стать немного сложнее. Нечеткие отношения множеств включают в себя получение новых оценок для принадлежности к результату из оценок в исходных множествах. В этой статье мы рассмотрим концепции нечетких объединений и пересечений в SQL Server.
Нечеткие объединения
С нечеткими объединениями мы фактически просим SQL Server предоставить нам любые записи, которые являются членами любого из множеств. Это можно достичь, извлекая максимальные значения из множеств. Давайте посмотрим на пример кода для нечетких объединений:
DECLARE @UnionTable TABLE (
PrimaryKey sql_variant,
Value decimal(38, 6),
MembershipScoreForSet1 decimal(38, 6),
MembershipScoreForSet2 decimal(38, 6),
StandardUnion AS (CASE WHEN MembershipScoreForSet1 >= MembershipScoreForSet2 THEN MembershipScoreForSet1 ELSE MembershipScoreForSet2 END),
DrasticUnion AS (CASE WHEN MembershipScoreForSet1 = 0 THEN MembershipScoreForSet2 WHEN MembershipScoreForSet2 = 0 THEN MembershipScoreForSet1 ELSE 1 END),
AlgebraicSum AS (MembershipScoreForSet1 + MembershipScoreForSet2) - (MembershipScoreForSet1 * MembershipScoreForSet2),
BoundedSum AS (CASE WHEN MembershipScoreForSet1 * MembershipScoreForSet2 > 1 THEN 1 ELSE MembershipScoreForSet1 * MembershipScoreForSet2 END)
)
INSERT INTO @UnionTable (PrimaryKey, Value, MembershipScoreForSet1, MembershipScoreForSet2)
SELECT CASE WHEN T1.PrimaryKey IS NULL THEN T2.PrimaryKey ELSE T1.PrimaryKey END,
CASE WHEN T1.Value IS NULL THEN T2.Value ELSE T1.Value END,
ISNULL(T1.MembershipScore, 0),
ISNULL(T2.MembershipScore, 0)
FROM (
SELECT PrimaryKey, Value, MembershipScore
FROM @ZScoreTable
WHERE Value != 142
) AS T1
FULL JOIN (
SELECT PrimaryKey, Value, MembershipScore
FROM @ModifiedZScoreTable
WHERE Value != 147
) AS T2
ON T1.PrimaryKey = T2.PrimaryKey
WHERE T1.Value IS NOT NULL OR T2.Value IS NOT NULL
SELECT * FROM @UnionTable ORDER BY DrasticUnion ASC
В приведенном выше коде мы используем две таблицы-переменные для хранения результатов двух множеств. Затем мы выполняем полное объединение этих множеств и вычисляем нечеткое объединение с помощью различных математических операций. Результирующая таблица-переменная, @UnionTable, содержит значения нечеткого объединения для каждой записи.
Нечеткие пересечения
С другой стороны, нечеткие пересечения включают получение всех записей, которые являются членами обоих множеств. Это можно достичь, извлекая минимальные значения из множеств. Вот пример кода для нечетких пересечений:
DECLARE @IntersectionTable TABLE (
PrimaryKey sql_variant,
Value decimal(38, 6),
MembershipScoreForSet1 decimal(38, 6),
MembershipScoreForSet2 decimal(38, 6),
StandardIntersection AS (CASE WHEN MembershipScoreForSet1 <= MembershipScoreForSet2 THEN MembershipScoreForSet1 ELSE MembershipScoreForSet2 END),
DrasticIntersection AS (CASE WHEN MembershipScoreForSet1 = 1 THEN MembershipScoreForSet2 WHEN MembershipScoreForSet2 = 1 THEN MembershipScoreForSet1 ELSE 0 END),
AlgebraicProduct AS (MembershipScoreForSet1 * MembershipScoreForSet2),
BoundedDifference AS (CASE WHEN MembershipScoreForSet1 - MembershipScoreForSet2 < 0 THEN 0 ELSE MembershipScoreForSet1 - MembershipScoreForSet2 END)
)
INSERT INTO @IntersectionTable (PrimaryKey, Value, MembershipScoreForSet1, MembershipScoreForSet2)
SELECT CASE WHEN T1.PrimaryKey IS NULL THEN T2.PrimaryKey ELSE T1.PrimaryKey END,
CASE WHEN T1.Value IS NULL THEN T2.Value ELSE T1.Value END,
ISNULL(T1.MembershipScore, 0),
ISNULL(T2.MembershipScore, 0)
FROM (
SELECT PrimaryKey, Value, MembershipScore
FROM @ZScoreTable
WHERE Value != 142
) AS T1
FULL JOIN (
SELECT PrimaryKey, Value, MembershipScore
FROM @ModifiedZScoreTable
WHERE Value != 147
) AS T2
ON T1.PrimaryKey = T2.PrimaryKey
WHERE T1.Value IS NOT NULL OR T2.Value IS NOT NULL
SELECT * FROM @IntersectionTable ORDER BY DrasticIntersection DESC
В этом коде мы выполняем аналогичную операцию, как и с нечеткими объединениями, но на этот раз мы вычисляем нечеткое пересечение с использованием других математических операций. Результирующая таблица-переменная, @IntersectionTable, содержит значения нечеткого пересечения для каждой записи.
Заключение
Нечеткие отношения множеств в SQL Server могут быть сложными, но они предлагают способ моделирования различных типов неопределенности и сравнения на основе нечеткой логики. Понимая концепции нечетких объединений и пересечений, вы можете использовать эти техники для решения различных задач. Хотя реализация может потребовать некоторых математических вычислений, SQL Server предоставляет необходимые инструменты для выполнения этих операций эффективно.