按一个变量排序,按另一个变量分组,select 第一行 SQL R 中的查询

Sort by one variable, group by another, and select first row in SQL Query in R

我需要在 SQL 中应用一个程序,该程序自 R 以来对我来说很容易,但在 SQL 中却非常曲折。

我需要按两个变量从高到低对数据进行排序,根据另一个变量进行分组,select每组中的第一项。

我将尝试从 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 函数可以帮助我。

感谢您的帮助。

也许是以下?

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