使用n_distinct进行Postgres表

时间:2017-11-16 21:43:40

标签: r postgresql dplyr dbplyr

我正在尝试使用dplyrdbplyr与Postgres表进行交互,而不将数据收集(拉)到R. 如果表的格式如下x所示,我如何计算定义的分组中不同值的计数?

例如,这个例子是模仿我想做的事情:

# Would actually be x = tbl(src = "postgres_conn", "x")

x = data.frame(
    a = c(1, 1, 2, 2, 3, 3),
    b = c(1, 1, 1, 2, 2, 2),
    c = c(1, 2, 3, 1, 2, 3)
)

> x
  a b c
1 1 1 1
2 1 1 2
3 2 1 3
4 2 2 1
5 3 2 2
6 3 2 3

x %>% group_by(a, b) %>% mutate(Count = n_distinct(c))

# Results
# A tibble: 6 x 4
# Groups:   a, b [4]
      a     b     c Count
  <dbl> <dbl> <dbl> <int>
1     1     1     1     2
2     1     1     2     2
3     2     1     3     1
4     2     2     1     1
5     3     2     2     2
6     3     2     3     2

如果我在Postgres tbl上使用n_distinct(c),我会收到以下错误:窗口函数没有实现DISTINCT。
我尝试了length(unique(c)),它返回了语法错误。

尝试

sql('COUNT(DISTINCT(c))') 

给了我这个错误:

column "c" does not exist. HINT:  Perhaps you meant to reference the column "aresphukou.c."

但是,aresphukou是一个任意临时表名,每次运行查询时都会更改。

最后,我尝试了replyr_uniqueValues,但似乎忽略了分组,并为所有Count值返回值1.

有人可以建议如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我在将近四年后偶然遇到了这个问题。使用 dbplyr/dplyr,您可能无法获得所需的响应,但使用 PostgreSQL,您可以通过将子查询或 CTE(公共表表达式)的结果与 x 表连接来实现:

with y as (
select a, b, count(c) as n
from x
group by a,b
)
select a, b, c, n
from x
left join y using (a,b);