【问题标题】:sqldf update errorsqldf更新错误
【发布时间】:2026-02-05 18:05:01
【问题描述】:

我有两个数据集,类似于

Datset1

Index  Mac Date         Cons
1      35  1432425600   Nil
2      35  1431993600   Nil
3      35  1433894400   Nil
4      35  1433376000   Nil

 Dataset2

Index  Mac Start_Date  End_Date       Cons
1      35  1432339200  1432771200     D1
2      35  1433116800  1435017600     D2

所以,我正在寻找的只是一个结果集,来自 Dataset1,它在 dataset2 上的 Mac 列上匹配,并且 [Dataset1.Date] 应该在 [Dataset2.Start_Date] 和 [Dataset.End_Date] 之间,以获取该列缺点。所以理想情况下,我的结果应该类似于

Final Dataset
Index  Mac Date         Cons
1      35  1432425600   D1
2      35  1431993600   Nil
3      35  1433894400   D2
4      35  1433376000   D2

我在使用 sqldf 时尝试在 R 中实现它,一开始我只在 Mac 上使用了 1 个简单代码

sqldf2 <- sqldf("update dataset1
            set dataset1.Cons = dataset2.Cons
            FROM dataset1 INNER JOIN dataset2
            ON dataset1.Mac = dataset2.Mac") 

但它给了我一个错误

Error in rsqlite_send_query(conn@ptr, statement) : near ".": syntax error

我打算进一步使用这样的东西,这绝对不对,也请帮忙

sqldf2 <- sqldf("update dataset1
            set dataset1.Cons = dataset2.Cons
            FROM dataset1 INNER JOIN dataset2
            ON dataset1.Mac = dataset2.Mac 
            AND (dataset1.Date > dataset2.Start_Date & dataset1.Date<dataset2.End_Date)")

感谢所有帮助!

【问题讨论】:

    标签: r sqlite join sql-update sqldf


    【解决方案1】:

    我们可以使用左连接:

    # dummy data*
    dataset1 <- read.table(text = "
    rn  Mac Date         Cons
    1      35  1432425600   Nil
    2      35  1431993600   Nil
    3      35  1433894400   Nil
    4      35  1433376000   Nil", header = TRUE)
    
    dataset2 <- read.table(text = "
    rn  Mac Start_Date  End_Date       Cons
    1      35  1432339200  1432771200     D1
    2      35  1433116800  1435017600     D2", header = TRUE)
    
    library(sqldf)
    
    sqldf("select a.rn, a.Mac, a.Date, b.Cons
           from dataset1 a
           left join dataset2 b
           on a.Mac = b.Mac and
              a.Date >= b.Start_Date and
              a.Date <= b.End_Date")
    
    #   rn Mac       Date Cons
    # 1  1  35 1432425600   D1
    # 2  2  35 1431993600 <NA>
    # 3  3  35 1433894400   D2
    # 4  4  35 1433376000   D2
    

    注意:我将“Index”改为“rn”,否则会引发错误。

    【讨论】:

    • 谢谢,很有帮助。还请指出我在 sqldf 中使用更新时犯了什么错误,因为我共享了代码。
    • @manusharma 请参阅this post:“SQLite 不支持 UPDATE 语句中的 JOIN”