我想通过(年龄组,等级)订购搜索结果,并且拥有1天,1周,1个月,6个月等年龄组。我知道我可以使用
获得“岁月”SELECT NOW()::DATE - created_at::DATE FROM blah
并且我正在考虑基于此做一个CASE声明,但是我是否明智地表达了正确的树性能?有更好的方法吗?
答案 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;