每组计数,每组都有自定义条件

时间:2015-10-31 14:43:06

标签: database postgresql

我有一个应用程序,用户可以在其中创建组,然后为每个组指定条件。目前我将条件作为类型/字段/值列存储在一个单独的表中,并从中生成WHERE子句(在我的应用程序代码中)。我可以改为创建数据库视图或函数。

用户可以选择的条件的一些示例(在哪里?是用户定义的):

  • field1 > ?
  • field2 ILIKE '?%'
  • 可能需要加入(如果总是完成所有联接,则不会造成伤害)

现在我想为几个这样的组(每个组具有不同的条件)获得count(distinct id)个匹配的行。单个行可能匹配多个组,在这种情况下,它应该计入所有组。

有没有办法在单个查询中执行此操作,可能使用视图(但不是物化视图)或pl / pgSQL(如果符合条件,则检查每一行,考虑到它可以匹配多个组的条件)? CASE可能在这里工作吗?每行可能匹配多个组的事实似乎是有问题的。如有必要,我可以修改数据库架构。

在特定情况下,所有组将匹配来自表的特定子集的行(即WHERE user_id = X)。所以我想要的是在一次传递中遍历所有这些行,并确定每个行匹配哪些组(可能是多个)。

到目前为止我能够做到的最好的是为所有组生成查询,然后UNION - 将它们放在一起,这样我就不需要多次往返DB了。是否有更高效的解决方案,或者这是我在这种情况下能做的最好的解决方案?基本上我想避免N + 1查询只是为了得到计数。

1 个答案:

答案 0 :(得分:1)

你可能需要filter in aggregate expression,这是Postgres 9.4中引入的一项功能。例如:

drop table example;
create table example (id int, col1 text, col2 text, qty int);
insert into example values
(1, 'a', 'b', 1),
(2, 'a', 'a', 10),
(3, 'a', 'c', 11);

select
    count(distinct id) filter (where col1 ilike 'a%') cond1,
    count(distinct id) filter (where col2 = col1) cond2,
    count(distinct id) filter (where qty = any (array[1, 2, 3])) cond3
from
    example;

 cond1 | cond2 | cond3 
-------+-------+-------
     3 |     1 |     1
(1 row)