我在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
答案 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