R语言 如何执行SQL连接的一个表和另一个表有一个聚合值的一列的第一个表?

dohp0rv5  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(126)

我尝试在不使用嵌套查询的情况下使用R中的sqldf库对航班表进行子集化。我使用一个查询计算了中值和平均值,并将其存储到不同的表中。最后,我尝试应用WHERE条件进行求解,但我无法理解为什么JOIN函数会这样。我有两个问题。
1.在ON参数后没有指定两个键的情况下,如何执行INNER JOIN?
1.它基本上是把中间值和平均值放在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"
)
ajsxfq5m

ajsxfq5m1#

    • 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)**这可以使用window function来完成,它避免了第二个表:
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)")
sqldf("with B as (
  select a, sum(b) as sum 
    from DF 
    group by a
)
select *
  from DF A
  left join B using(a)")

相关问题