PSQL:如何通过另一列获取列组中每个值的记录计数

时间:2017-12-16 01:56:00

标签: mysql sql psql postgrest

PSQL: 我的主表有2000万条记录,当我运行我的选择它运行了几个小时。 有没有办法更好地写这个陈述?

我的表:

Select * from lookup limit 10;
-------------------------
month      id
2010-01     598362
2010-01     598343
2010-02     598343
2010-02     988343
2010-03     789624
2010-04     789624
2010-05     789624
2010-06     899624 

从表中我试图找到

  1. 该月的不同ID的计数
  2. 过去2个月内也存在的明显身份的数量
  3. 我的选择语句(如下)适用于小数据(最多100,000条记录)

    --PSQL
    select  month, 
        count (distinct id)id_ct,
        count (distinct case when (
                        id||(month-1) in (select distinct id||month from lookup ) 
                    or  id||(month-2) in (select distinct id||month from lookup )  ) 
                        then id end) continuous_ct
        from lookup
        group by 1  order by 1
    

    结果:

    month     id_ct continuous_ct
     2010-01    2   0
     2010-02    2   1
     2010-03    1   0
     2010-04    1   1
     2010-05    1   1
     2010-06    1   0
    

    谢谢!

1 个答案:

答案 0 :(得分:0)

如果你有id的索引,那么这个简单的查询应该有效。刚刚离开桌子加入自己。 http://sqlfiddle.com/#!15/133a9/7/0

select to_char(lookup_a.lookup_month, 'yyyy-mm'),
    count (distinct lookup_a.id) id_ct,
    count (distinct lookup_b.id) continuous_ct
from lookup lookup_a
left join lookup lookup_b 
    on lookup_b.id = lookup_a.id
    and lookup_b.lookup_month between lookup_a.lookup_month - interval '2 month'
    and lookup_a.lookup_month - interval '1 month'
group by 1  
order by 1