SQL中的时间直方图

时间:2019-02-25 20:42:17

标签: sql postgresql

我想以1天为间隔合并下表中的信息,对于所有列,计算每个间隔中的uuid数量

uuid   days_to_signup    days_to_doc_submission1 
 1         1,5                     3
 2         2,5                     5
 3         3,2                     3,6
 4         0,5                     4,2
 5         200                     250

我想要一个这样的表:

time count(days_to_signup)   count(days_to_doc_submission1)
 0-1         1                    0
 1-2         1                    0
 2-3         1                    0
 3-4         1                    2
 4-5         0                    1
  ...
 200-201     1                    0
 201-202     0                    0
 ...
 250-251     0                    1

这里最大的问题是在没有定义case when子句的情况下做到这一点。天数可能长达2年(730天)。

但是,我认为了解硬件以更通用的方式(例如,不同的间隔)来做到这一点。谢谢

1 个答案:

答案 0 :(得分:0)

这是您想要的吗?

select gs.t,
       (select count(*)
        from t
        where t.days_to_signup >= t and t.days_to_signup < t + 1
       ) as count_dts,
       (select count(*)
        from t
        where t.days_to_doc_submission1 >= t and t.days_to_doc_submission1 < t + 1
       ) as count_dds
from generate_series(0, 251, 1) as gs(t)
order by gs.t;

generate_series()是Postgres中的内置函数,可生成一系列数字或日期。这将为您提供所需的行。实际计数是使用相关子查询完成的。

还有其他方法,但这似乎是最简单的。

一种更有效的方法是:

with x as (
      select days_to_signup as days, 1 as dts, 0 as dss
      from t
      union all
      select days_to_doc_submission1, 0, 1
      from t
     )
select gs.t, coalesce(sum(dts), 0) as dts, coalesce(sum(dss), 0) as dss
from generate_series(0, 251, 1) gs(t) left join
     x
     on x.days >= gs.t and
        x.days < gs.t
group by gs.t
order by gs.t;