我想知道你是否可以提供帮助。我试图使用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,以及这是否是最有效的方式。
答案 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 BY
在HAVING
之前。