R中的MySQL使用GROUP BY过滤最早的日期

时间:2015-12-09 13:54:39

标签: mysql r date filter

我在SQL数据库中有一个表要在R中检索。但是在我用来从数据库中检索它的代码中,我想先在SQL查询中进行一些过滤。

示例数据。当:

library(RMySQL)
mydb = dbConnect(MySQL(), user=***, password=***, dbname=***, host='127.0.0.1')
log = dbGetQuery(mydb, "select * FROM log_item;)

然后我得到一个类似的数据框:

firmwareVersion <- c("fw3","fw4","fw4","fw5","fw5")
date_created <- c("2015-09-01 21:04:10","2015-09-04 07:13:10","2015-10-03 15:23:09","2015-10-05 22:31:58","2015-10-06 23:34:03")
type <- c("type1","type1","type1","type2","type2")

log <- data.frame(firmwareVersion,date_created,type)

我希望每个type只有firmwareVersion具有最早的日期。 所以我的结果应该是:

type1 || 2015-09-01 21:04:10 || fw3
type1 || 2015-09-04 07:13:10 || fw4
type2 || 2015-10-05 22:31:58 || fw5

我试过了:

logDateMin = dbGetQuery(mydb, "select min(log_item.date_created) 
FROM log_item group by type,firmwareVersion;")

当我在R中尝试它时,它永远不会完成查询并保持&#34;计算&#34;。我认为日期是字符串而不是日期,但我现在不知道如何转换它(我查了一下,但找不到合适的解决方案)。也没有&#34; min(log_item.date_created)&#34;但是&#34; group by&#34;它永远不会完成。没有两者,它会立即产生结果。

我知道我可以在R和dplyr中轻松完成这项工作,但我有太多的数据,我认为最好在SQL代码中执行此操作。有很多重复的固件版本,我只需要最旧版本。

我希望我的信息足够详细,希望有人可以帮助我。

亲切的问候,

罗宾

为SERBAN编辑

firmwareVersion                  type     date_created
1.4.20@91347 128d491347 128d4 || type1 || 2015-09-26 13:43:55
1.4.20@91347 128d491347 128d4 || type1 || 2015-09-27 12:56:00
1.5.20@91347 128d491347 128d4 || type1 || 2015-09-28 12:19:28
1.4.20@91347 128d491347 128d4 || type2 || 2015-09-29 05:08:48
1.6.20@91347 128d491347 128d4 || type2 || 2015-09-29 11:43:19
1.6.20@91347 128d491347 128d4 || type2 || 2015-09-29 17:32:28
1.4.20@91347 128d491347 128d4 || type3 || 2015-09-29 17:37:36  
1.5.20@91347 128d491347 128d4 || type3 || 2015-09-29 17:38:55
1.6.20@91347 128d491347 128d4 || type4 || 2015-09-29 17:47:12
1.6.20@91347 128d491347 128d4 || type4 || 2015-09-29 17:54:08

需要的结果:

1.4.20@91347 128d491347 128d4 || type1 || 2015-09-26 13:43:55
1.5.20@91347 128d491347 128d4 || type1 || 2015-09-28 12:19:28
1.4.20@91347 128d491347 128d4 || type2 || 2015-09-29 05:08:48
1.6.20@91347 128d491347 128d4 || type2 || 2015-09-29 11:43:19
1.4.20@91347 128d491347 128d4 || type3 || 2015-09-29 17:37:36  
1.5.20@91347 128d491347 128d4 || type3 || 2015-09-29 17:38:55
1.6.20@91347 128d491347 128d4 || type4 || 2015-09-29 17:47:12

1 个答案:

答案 0 :(得分:0)

您从未指定过您要反对的SQL数据库的类型。试试这个问题:

SELECT
 type
 ,date_created
 ,firmwareVersion
FROM log_item
WHERE date_created = min(date_created)
ORDER BY type,firmwareVersion

某些数据库可能会抱怨where子句中的min()。因此,在这种情况下,您将使用嵌套选择。

SELECT
type
,date_created
,firmwareVersion
FROM (
SELECT
 type
 ,date_created
 ,firmwareVersion
 ,min(date_created) as min_date
FROM log_item)
WHERE date_created = min_date
ORDER BY type,firmwareVersion