在重叠之间和之间加入两个数据帧SQL

时间:2016-02-07 18:46:34

标签: sql r

我正在尝试连接两个数据框,这些数据框在SQL中将使用where和a语句来表示日期。

在SQL中,代码为:

select Date,(Value1-Test1) as Ans1,(Value2-Test2) as Ans2,ID
from Data a
 inner join Test b on a.ID=b.ID and a.Date between b.DateStart and c.DateEnd 

这是数据

Date                Value1  Value2  ID
01/01/16 19:30:00       10      30  A
01/01/16 19:50:20       20      40  B
01/01/16 19:55:30       30      50  C

这是测试

RowNumber   DateStart            DateEnd    Test1   Test2   ID
1   01/01/16 17:00:00   01/01/16 22:00:05   2          4    A
2   01/01/16 22:00:06   01/01/16 01:50:00   3          6    A
3   01/01/16 17:00:00   01/01/16 22:00:05   4          8    B
4   01/01/16 22:00:06   01/01/16 01:50:00   5          2    B
5   01/01/16 17:00:00   01/01/16 22:00:05   6          4    C
6   01/01/16 22:00:06   01/01/16 01:50:00   7          5    C

我想要创建的结果

Date                  Ans1    Ans2 ID
01/01/16 19:30:00        8      26  A
01/01/16 19:50:12       16      32  B
01/01/16 19:55:24       24      46  C

任何帮助和指示都会很棒。

2 个答案:

答案 0 :(得分:3)

根据@ zx8754的建议,我尝试使用data.table::foverlaps()

在“数据”中,将“日期”字段重命名为DateStart,并创建第二个日期字段,其中DateEnd = Date。添加以下代码:

while (clock <= start + 58) {
     ...
     Sleep(2000); }

这给了我我想要的东西。

Finding Overlaps between interval sets / Efficient Overlap Joins

答案 1 :(得分:0)

只需merge ID上的两个数据集,然后有条件地过滤后面的行,这些行对应于SQL的JOINWHERE子句。最后,运行计算并在之后选择列。

mergedf <- merge(data, test, by="ID")

mergedf <- mergedf[(mergedf$Date >= mergedf$DateStart & 
                    mergedf$Date <= mergedf$DateEnd),]

mergedf$Ans1 <- mergedf$Value1 - mergedf$Test1
mergedf$Ans2 <- mergedf$Value2 - mergedf$Test2

mergedf <- mergedf[c('Date', 'Ans1', 'Ans2', 'ID')]