У меня есть база данных умеренного размера с множеством таблиц соединений и поиска.
Я больше знаком с R, чем с SQL, и я использую MySQL.
Мой вопрос:
В какой момент полезно прекратить увеличивать сложность оператора SQL в пользу функциональности подмножества данных в R (например, merge
, *apply
, maply
, dlply
и т.д.) в R.
С одной стороны, объединение SQL проще, чем выбор всего содержимого каждой таблицы и использование функции R merge
для их объединения. Кроме того, выполнение условных выборок в SQL уменьшит объем данных, которые необходимо импортировать в R; но разница в скорости незначительна.
С другой стороны, большое объединение со сложным предложением where становится менее понятным, чем синтаксис R.
Ниже у меня есть непроверенный код для иллюстративных целей: я задаю этот вопрос до того, как у вас есть рабочий код, и ответ на мой вопрос не требует рабочего кода (хотя это всегда ценится) - "самый изящный подход", "наименьшее количество строк" или "потрясающая реализация X" всегда приветствуются, но меня особенно интересует "разумный/практический/канонический/основанный на первых принципах".
Меня интересует общий ответ о том, какие шаги должны использовать предложение SQL where
, и какие шаги будет проще выполнить с помощью R.
Иллюстрация:
Описание базы данных
есть три таблицы: a
, ab
и b
. Таблицы a
и b
имеют первичный ключ id
. Они имеют много-много отношений, которые представлены таблицей поиска, ab
, которая содержит поля ab.a_id
и ab.b_id
, которые присоединяются к a.id
и b.id
соответственно. Обе таблицы имеют поле time
, а a имеет поле group
.
Цель:
Вот минимальный пример соединения и подмножества, которые я хочу сделать,
(Именование наименований элементов, например a.id
, эквивалентно a$id
в R)
-
Объедините таблицы
a
иb
с помощьюab
, добавив несколько новых значенийb.time
, связанных с каждымa.id
, в качестве нового столбца;select a_time, b.time, a.id, b.id from a join ab on a.id = ab.a_id join b on b.id = ab.b_id and then append b.time for distinct values of b.id;
-
Мне не нужны повторяющиеся значения b.time, мне нужно только значение
b.max
: для повторных значенийb.time
, соединенных с каждымa.id
,b.max
является значениемb.time
ближе всего, но не большеa.time
b.max <- max(b.time[b.time < a.time))
- добавьте значение
dt <- a.time - b.max
в таблицу, например, в R, -
для каждого отдельного значения в
a.group
, выберите, какой (min (x.dt)))x.dt <- a.time - b.max