Найти моду в классической реляционной алгебре со связанными условиями - PullRequest
0 голосов
/ 12 октября 2019

Мне дали таблицу с двумя столбцами: id_ship и date. Мне нужно найти идентификаторы кораблей, которые появляются максимальное количество раз (то есть кораблей с максимальным числом дат), при условии, что у корабля не может быть больше трех дат.

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

РЕДАКТИРОВАТЬ: Извините, я думал, что понятие "классическая реляционная алгебра" было стандартным. Операции, которые. Операции, поддерживаемые моим RA: выбор, проект, переименование, объединение, разность, пересечение, декартово произведение, естественное соединение, соединение с условием и делением

1 Ответ

1 голос
/ 13 октября 2019

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

Итак, вы говорите, что для каждого id_ship в данной таблице может быть 3, 2 или 1 вхождения. Предположительно для вашего «тройного декартова произведения» (который будет самостоятельным продуктом с переименованием) вы собираетесь создать строку с тремя датами, восходящими слева направо (чтобы вы могли убедиться, что сам продукт не дублируется)даты).

Хорошо, тогда для случаев с двумя случаями вам нужно двойное декартово произведение, даты возрастают слева направо. Исключите те id-ship s, которые уже появляются в тройках.

Для случая 1 случая исключите те id-ship s, которые появляются в любом из вышеперечисленных.

Затем UNION вместе три результата:

SELECT id-ship, 3 AS count
FROM occ3
UNION
SELECT id-ship, 2 AS count
FROM occ2
UNION
SELECT id-ship, 1 AS count
FROM occ1 ;

Теперь у вас есть обычная таблица в групповом стиле с подсчетом.

Ах, но вы хотели, чтобы RA неSQL? Затем мы сталкиваемся с трудностями какой версии RA. Версии отличаются тем, какие операторы доступны. И, например, версия «дедушки» Codd 1972 даже не включала переименование, поэтому вы даже не могли создать этот тройной декартовой продукт.

Все версии поддерживают UNION OK;все проекции поддержки, что вам нужно для получения id-ship из трех отдельных результатов запроса.

Предположим, что ваш RA поддерживает литералы отношения: {{count 3}} - это (одноэлементный) набор кортежей, каждый кортежбудучи набором пар имя-значение атрибута

(pi<id-ship>(occ3) x {{count 3}})
UNION
(pi<id-ship>(occ2) x {{count 2}})
UNION
(pi<id-ship>(occ1) x {{count 1}})

Если ваш RA не поддерживает литералы отношения, он может поддерживать операцию EXTEND

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