2017-08-16 43 views
0

我想知道您是否可以提供帮助。我正在尝试使用data.table在R中复制这个MS Access SQL查询。查询是:将SQL查询转换为R中的data.table以进行分组

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] 

我基本上要为有它看到的第一个日期和终止日期基于它的第一个观察的代码可以出现在代码分组每个代码AA单观察每次激活多次。

所以从:

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,以及这是否是最有效的方法。

+0

如果你得到的是较低的#行,但每个代码只有一行,那么它必须是HAVING部分是Borked /错译的,对吗?你的代码看起来很好,除非你不需要'。(Code,'因为你已经从'by = Code'获得了它。如果你可以发布一个例子,它可能有助于将它放下。参见https:// stackoverflow。 com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

+0

谢谢你,我认为Parfait的答案已经解决了它,我会努力做到可重复的,因为有> 200k行在数据库中:) – MrMonkeyBum

回答

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当数据库引擎运行的最终结果集之前在背景虚表。

+0

谢谢你的运行更好,我意识到我在日期周围进行的后续查询存在错误。我现在正在匹配。 – MrMonkeyBum

+0

太棒了!乐意效劳。不用谢。 – Parfait