【问题标题】:Sort by one variable, group by another, and select first row in SQL Query in R按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行
【发布时间】:2021-12-07 22:35:09
【问题描述】:

我需要在 SQL 中应用一个从 R 开始对我来说很容易的过程,但在 SQL 中确实很曲折。

我需要将数据按两个变量从高到低排序,根据另一个变量分组,然后选择每个组中的第一项。

我留下了我试图从 R 传递到 SQL 的代码。不幸的是,在尝试将一种语言转换为另一种语言时,dbplyr 包向我抛出了一个错误:错误:first() 仅在窗口化 (mutate()) 上下文中可用

library(tidyverse)
library(dbplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, mtcars)

mtcars2 <- tbl(con, "mtcars")
mtcars2

mtcars2 %>% 
  arrange(-mpg,-disp) %>% 
  group_by(cyl) %>% 
  summarise(hp = first(hp)) %>% 
  show_query()

在我看来,DISTINCT ON 功能可以帮助我。

感谢您的帮助。

【问题讨论】:

    标签: sql r rodbc


    【解决方案1】:

    也许是以下?

    library(tidyverse)
    library(dbplyr)
    
    con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
    copy_to(con, mtcars)
    
    mtcars2 <- tbl(con, "mtcars")
    
    mtcars2 %>%
      arrange(-mpg,-disp) %>%
      group_by(cyl) %>%
      mutate(hp = first(hp)) %>% 
      select(cyl, hp) %>% 
      distinct %>% 
      show_query
    
    #> <SQL>
    #> SELECT DISTINCT `cyl`, FIRST_VALUE(`hp`) OVER (PARTITION BY `cyl` ORDER BY -`mpg`, -`disp`) AS `hp`
    #> FROM `mtcars`
    #> ORDER BY -`mpg`, -`disp`
    

    见:https://github.com/tidyverse/dbplyr/issues/129

    【讨论】:

    • 非常感谢,我正在测试代码(原表很大)。我遵循了您的代码,但在按 cyl 分组后删除了对我来说似乎不必要的 distinct() 函数
    • 我猜你真的需要distinct,@NicolasRatto! mutate 没有总结,因此会得到很多重复的行!我通过在mtcars 上运行代码确认了这一点。
    • 你说得对,我不知道为什么我认为变异是一个总结。我会回去测试不同的。
    • 当我用我的真实数据测试它时,我得到以下错误:当指定 SELECT DISTINCT 时,ORDER BY 中的项目必须出现在选择列表中
    • 它通过删除最后一行 ORDER BY 代码对我有用。非常感谢您的帮助。
    猜你喜欢
    • 2020-12-14
    • 2017-01-31
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多