You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Postgres后端实现类似unique/distinct功能的聚合方法

PostgreSQL后端dbplyr表聚合取唯一值解决方案

问题原因

unique()是R原生的去重函数,不属于标准SQL聚合函数,dbplyr无法直接将其转换为可在PostgreSQL端执行的SQL语句;而distinct()是用于整表/整行去重的操作,不能在summarise()中作为聚合函数使用,因此你的原代码无法得到预期结果。

可行方案

方案1:分组后目标列仅存在1个唯一值的场景

如果你确认要聚合的列(示例中的a)在分组后仅包含1个唯一值,直接使用MAX()或MIN()聚合函数即可,二者均能返回该唯一值,且是标准SQL函数,dbplyr可直接转换:

library(tidyverse)
library(dbplyr)

dbplyr::memdb_frame(a=c(2,2,2), b=c(2,3,4)) %>%
  summarise(
    aggregatedSum = sum(b), 
    aggregatedUnique = max(a)
  )

执行结果和你先collect()再聚合的输出完全一致。

方案2:分组后目标列存在多个唯一值的场景

如果目标列分组后可能有多个不同值,你可以通过sql()函数直接调用PostgreSQL原生的ARRAY_AGG(DISTINCT 列名)聚合函数,将所有唯一值聚合为数组存储在结果中:

dbplyr::memdb_frame(a=c(2,2,3), b=c(2,3,4)) %>%
  summarise(
    aggregatedSum = sum(b), 
    aggregatedUnique = sql("ARRAY_AGG(DISTINCT a)")
  )

如果后续需要仅取第一个唯一值,也可以调整SQL片段为sql("ARRAY_AGG(DISTINCT a)[1]"),直接在数据库端返回单个值。

内容的提问来源于stack exchange,提问作者werN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:45:04