【问题标题】:Retrieve all rows with same minimum value for a column with sqldf使用 sqldf 检索具有相同最小值的列的所有行
【发布时间】:2017-11-05 10:42:46
【问题描述】:

我必须检索已完成最少工作数量的员工的 ID。有多名员工完成了一项工作。我当前的 sqldf 查询仅检索 1 行数据,而有多个员工 ID 只完成了一项工作。为什么它停在第一个最小值?以及如何获取列中具有最小值的所有行?这是一个数据样本:

ID  TaskCOunt
1    74
2    53
3    10
4     5
5     1
6     1
7     1

我用过的代码:

sqldf("select id, min(taskcount) as Jobscompleted
       from (select id,count(id) as taskcount 
            from MyData
            where id is not null 
            group by id order by id)")

输出是

ID   leastcount
5     1

而我想要的是完成最少作业的所有行。

ID  Jobscompleted
5     1
6     1 
7     1

【问题讨论】:

    标签: r sqldf


    【解决方案1】:

    min(...) 总是在 SQL 中返回一行,所有 SQL 聚合函数也是如此。试试这个:

    sqldf("select ID, TaskCount TasksCompleted from MyData 
           where TaskCount = (select min(TaskCount) from MyData)")
    

    给予:

       ID TasksCompleted
    1  5              1
    2  6              1
    3  7              1
    

    注意:可重现形式的输入是:

    Lines <- "
    ID  TaskCount
    1    74
    2    53
    3    10
    4     5
    5     1
    6     1
    7     1"
    MyData <- read.table(text = Lines, header = TRUE)
    

    【讨论】:

    • ... 更改列名将使用sqldf("SELECT ID, TaskCount AS JobsCompleted FROM MyData WHERE TaskCount = (SELECT MIN(TaskCount) FROM MyData)")
    • 这行得通。谢谢!但是你能解释一下为什么吗?我的查询只检索到一行,我相信我遗漏了一个重要的子查询概念。
    • 如答案min 中所述,始终返回单行。
    • @G.Grothendieck 所以当你使用 - where taskcount = (select min(..) 和只选择 min (..) 有什么不同
    • 是的,子选择总是返回一行。
    【解决方案2】:

    作为sqldf 的替代品,您可以使用data.table

    library(data.table)
    dt <- data.table(ID=1:7, TaskCount=c(74, 53, 10, 5, 1, 1, 1))
    
    dt[TaskCount==min(TaskCount)]
    
    ##    ID TaskCount
    ## 1:  5         1
    ## 2:  6         1
    ## 3:  7         1
    

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2017-11-07
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多