按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行

Posted

技术标签:

【中文标题】按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行【英文标题】:Sort by one variable, group by another, and select first row in SQL Query in R 【发布时间】: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 功能可以帮助我。

感谢您的帮助。

【问题讨论】:

【参考方案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 代码对我有用。非常感谢您的帮助。

以上是关于按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行的主要内容,如果未能解决你的问题,请参考以下文章

访问报告:如何按一个字段分组,但按另一个字段排序?

SQL Server:按分组列求和并按另一列排序

XSLT 2.0 按另一个样式表中的变量排序

按属性排序列表,然后按另一个

如何在 Firebase 云 Firestore 中查询一个字段然后按另一个字段排序?

如何按另一个列表对列表进行排序