2017-08-16 41 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