У меня есть база данных среднего размера с большим количеством объединений и таблиц поиска.
Я больше знаком с 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
, а в таблице есть поле group
.
Вот минимальный пример соединения и подмножества, который я хочу сделать;
(Именование элементов в MySQL, например, a.id
эквивалентно a$id
в R)
Соединение таблиц a
и b
с использованием ab
с добавлением нескольких значений b.time
, связанных с каждым a.id
, в качестве нового столбца;
выберите a_time, b.time, a.id, b.id из
соединение ab на a.id = ab.помогать
присоедините b к b.id = ab.b_id, а затем добавьте b.time для различных значений b.id;
Мне не нужны повторяющиеся значения b.time, мне нужно только значение b.max
: для повторяющихся значений b.time
, присоединенных к каждому a.id
, b.max
— значение b.time
, ближайшее к a.time
b.max <- max, но не превышающее его (б.время [б.время < а.время))
dt <- a.time - b.max
в таблицу, например, в R,для каждого отдельного значения в a.group
, выберите который (мин (x.dt)))
x.dt <- a.time - b.max