PostgreSQL计数基于列的条件

时间:2018-06-11 21:37:15

标签: sql postgresql

我有一个名为admin_descriptions的表,其中包含以下列:

description_idvalueadmin_idvalid_at

admins包含以下列:

state

我想要一个给出description_id的查询,它会为我提供使用该描述的活动管理员的计数。只要admin_descriptions表格中有一行description_idNOT NULL value和{{1},就会将管理员的说明视为已使用对于valid_at具有NULL value的任何其他条目,它最新。

所以,示例数据:

description_id

查询Row 1: description_id: 1 value: 'foo' admin_id: 2 valid_at: '2010-01-10' Row 2: description_id: 1 value: NULL admin_id: 2 valid_at: '2012-01-10' Row 2: description_id: 1 value: 'some value' admin_id: 4 valid_at: '2014-01-10' 时的计数为1.它只考虑第3行。因为即使存在值为NOT NULL的第一行,也存在第2行,其中valid_at是最新的admin_id及其description_id = 1为NULL。

我可以在不考虑value via:

的情况下获得计数
valid_at

如何修改此查询以考虑每个admin_id / description_id组合的SELECT COUNT(DISTINCT(ad.id)) AS COUNT FROM admin_descriptions ad JOIN admins ON admins.id = ad.admin_id WHERE ad.description_id = 1 AND admins.state = 'active'

2 个答案:

答案 0 :(得分:0)

我认为这样的事情应该允许你检查每个分组id的valid_at。 选择   COUNT(ad.id) 来自admin_description广告   INNER JOIN管理员ON admins.id = ad.admin_id     AND admins.state ='有效' 哪里   1 = 1    - AND valid_at - 但是你想要处理valid_at GROUP BY ad.id; 假设每个admin_id / description_id组合始终是唯一的。 如果没有,也许您可​​以先尝试对id,admin_id,description_id进行分组,然后先过滤掉重复项。

答案 1 :(得分:0)

我会使用distinct on获取最新的管理员说明,然后从那里进行汇总:

select count(*) as num_valid_admins
from (select distinct on (ad.admin_id) ad.*
     from admin_descriptions ad
     where ad.description_id = XXX
     order by ad.admin_id, ad.valid_at desc
    ) ad
where ad.value is not null;