Postgres时间线模拟器

时间:2014-01-24 04:11:59

标签: performance postgresql

我想通过(年龄组,等级)订购搜索结果,并且拥有1天,1周,1个月,6个月等年龄组。我知道我可以使用

获得“岁月”
SELECT NOW()::DATE - created_at::DATE FROM blah

并且我正在考虑基于此做一个CASE声明,但是我是否明智地表达了正确的树性能?有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您还可以创建具有间隔定义和标签的单独表格。然而,这需要额外加入才能获得数据。

create table distance (
  d_start int,
  d_end int,
  d_description varchar
);

insert into distance values
 (1,7,'1 week'),
 (8,30,'1 month'),
 (31,180,'6 months'),
 (181,365,'1 year'),
 (366,999999,'more than one year')
 ;

 with 

 sample_data as (
  select * 
  from generate_series('2013-01-01'::date,'2014-01-01'::date,'1 day') created_at
  )

select
  created_at,
  d_description
from
  sample_data sd
  join distance d on ((current_date-created_at::date) between d.d_start and d.d_end)
;

答案 1 :(得分:0)

出于性能原因,使用此函数更新存储在表中的INT列,并运行偶尔的更新任务。这样做的好处是,它只需要每小时对一小部分数据运行一次(任何<1周龄),每24小时就可以对抗任何事情&gt; 1周大(甚至可能是每周一次的老任务。)

CREATE OR REPLACE FUNCTION age_group(_date timestamp) RETURNS int AS
$$
DECLARE
  days_old int;
  age_group int;
BEGIN
  days_old := current_date - _date::DATE;
  age_group := CASE
    WHEN days_old < 2 THEN 0
    WHEN days_old < 8 THEN 1
    WHEN days_old < 30 THEN 2
    WHEN days_old < 90 THEN 3
    ELSE 4
  END;
  RETURN age_group;
END;
$$
LANGUAGE plpgsql;