Как выполнить SQL-соединение с таблицей и другой таблицей, имеющей совокупное значение одного из столбцов первой таблицы?

Я пытаюсь создать подмножество таблицы рейсов без использования вложенных запросов, используя библиотеку sqldf в R. Я вычислил медианные и средние значения, используя один запрос, и сохранил их в разных таблицах. В конце концов, я пытаюсь применить условие WHERE для решения, но я не могу понять, почему функция JOIN ведет себя так, как есть. У меня есть два вопроса.

  1. Как он может выполнить INNER JOIN без двух ключей, указанных после аргумента ON?
  2. По сути, это медианное и среднее значение во всех строках после JOINS. Почему?

Кто-нибудь может объяснить, что здесь происходит?

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"
)

Имена ваших таблиц во 2-й и 3-й строках не совпадают с именами в 4-й строке (медиана против медианы_q1), но я предполагаю, что это опечатка? В любом случае, ваши первые два SQL-оператора возвращают одно значение, поэтому я предполагаю, что вам не нужно указывать имя столбца в предложениях ON третьего SQL-оператора, поскольку нет вариантов, какой столбец будет использоваться. Я не понимаю, что означает ваш второй вопрос. Можете ли вы обновить свой вопрос некоторыми примерами данных, чтобы показать результат, который вы получаете?

NickW 11.02.2023 09:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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)")

Другие вопросы по теме