将SQL查询转换为R中的data.table,以便按分钟

时间:2017-08-16 17:42:40

标签: sql r data.table

我想知道你是否可以提供帮助。我试图使用data.table在R中复制此MS Access SQL查询。查询是:

SELECT Tbl_X.code, 
       Min(Tbl_X.DateTime) AS MinOfDateTime, 
       Max(Tbl_X.EndDate) AS MaxOfEndDate
FROM Tbl_X
GROUP BY Tbl_X.code
HAVING (((Min(Tbl_X.DateTime)) < DateAdd("d",1,[Forms]![Frm_ControlPanel]![CalcDateFromForm])))
ORDER BY Min(Tbl_X.DateTime);

HAVING部分将过滤掉今天日期的任何观察结果。

我的R代码是:

library(data.table)
...

events <- as.data.table(event_data)[DateTime < max(DateTime),]
                                   [order(DateTime),
                                   .(Code, 
                                     Min_event_date = min(DateTime), 
                                     Max_validity_date = max(EndDate)),
                                   by = Code]

我基本上希望每个代码都有一个单独的观察,它具有第一个日期,并且最后一个日期根据代码的第一次观察分组,因为代码每次激活时都会出现多次。

所以来自:

Code  DateTime     EndDate
 A    2017-02-09   2017-04-09
 A    2017-04-09   2017-06-09
 A    2017-07-09   2017-09-09
 B    2017-03-04   2017-05-11
 B    2017-06-04   2017-08-13

Code  DateTime     EndDate
 A    2017-02-09   2017-09-09
 B    2017-03-04   2017-08-13

但是,我从SQL中得到的总数略低一些。所以我想知道,首先是我正在做什么来复制SQL,以及这是否是最有效的方式。

1 个答案:

答案 0 :(得分:3)

在SQL中,HAVING子句通常是使用聚合的过滤器(与WHERE子句过滤器不同),并且您使用聚合:Min(Tbl_X.DateTime)。此外,您提前一天过滤了Access'表单控件值,您说这是今天使用DateAdd()后的日期。

因此,请考虑运行data.table包围两次:首先聚合然后过滤返回的聚合 Min_event_date

events <- as.data.table(event_data)[order(DateTime),
                                    .(Min_event_date = min(DateTime), 
                                      Max_validity_date = max(EndDate)),
                                    by = Code][Min_event_date < Sys.Date() + 1,]

可能这也是SQL中的操作顺序,当数据库引擎在最终结果集之前在后台运行虚拟表时,GROUP BYHAVING之前。