Я пытаюсь создать подмножество таблицы рейсов без использования вложенных запросов, используя библиотеку sqldf в R. Я вычислил медианные и средние значения, используя один запрос, и сохранил их в разных таблицах. В конце концов, я пытаюсь применить условие WHERE для решения, но я не могу понять, почему функция JOIN ведет себя так, как есть. У меня есть два вопроса.
Кто-нибудь может объяснить, что здесь происходит?
library(sqldf)
average = sqldf('SELECT AVG(distance) AS avg FROM flights')
median = sqldf('SELECT MEDIAN(distance) AS med FROM flights')
result = sqldf(
"SELECT flights.*
FROM flights
INNER JOIN average_q1 ON flights.distance
INNER JOIN median_q1 ON flights.distance
WHERE distance BETWEEN median_q1.med AND average_q1.avg"
)
1) Код в вопросе не воспроизводится (см. Инструкции по размещению в верхней части страницы тега r), поэтому мы будем использовать следующее:
library(sqldf)
# test inputs
DF <- data.frame(a = c(1, 1, 1, 2, 2, 2), b = 1:6)
DFsum <- sqldf("select a, sum(b) as sum from DF group by a")
sqldf("select *
from DF A
left join DFsum B using(a)")
давая:
a b sum
1 1 1 6
2 1 2 6
3 1 3 6
4 2 4 15
5 2 5 15
6 2 6 15
2) Это можно сделать с помощью оконной функции, которая избегает второй таблицы:
sqldf("select *, sum(b) over (partition by a) as sum from DF")
3) Агрегацию можно объединить прямо в оператор SQL следующим образом:
sqldf("select *
from DF A
left join (select a, sum(b) as sum
from DF
group by a) using(a)")
4) Эта альтернатива представляет собой другой способ объединения операторов SQL с использованием предложения with
, также известного как Common Table Expression (CTE)
sqldf("with B as (
select a, sum(b) as sum
from DF
group by a
)
select *
from DF A
left join B using(a)")
Имена ваших таблиц во 2-й и 3-й строках не совпадают с именами в 4-й строке (медиана против медианы_q1), но я предполагаю, что это опечатка? В любом случае, ваши первые два SQL-оператора возвращают одно значение, поэтому я предполагаю, что вам не нужно указывать имя столбца в предложениях ON третьего SQL-оператора, поскольку нет вариантов, какой столбец будет использоваться. Я не понимаю, что означает ваш второй вопрос. Можете ли вы обновить свой вопрос некоторыми примерами данных, чтобы показать результат, который вы получаете?