我有下表。 " quarter"中的每个值列是一个日历四分之一结束(例如3 / 31,6 / 30,9 / 30,12 / 31),数据可以追溯到20世纪70年代:
name | value | quarter
-------|-------|----------
bob | 12 | 2014-3-31
jane | 9 | 2014-6-30
bob | 12 | 2014-9-30
dave | 12 | 2014-12-31
bob | 7 | 2015-3-31
mary | 17 | 2015-6-30
mary | 12 | 2015-9-30
我根据是否超过指定的季度结束日期选择了一些记录:例如"选择> =到2个季度之前的行"或"> = 15个季度前"等等
从最近一个季度查找1年前的记录很简单:
SELECT * FROM mytable WHERE quarter >= (SELECT max(quarter) - interval '12 month' FROM mytable)
name | value | quarter
-------|-------|----------
bob | 12 | 2014-9-30
dave | 12 | 2014-12-31
bob | 7 | 2015-3-31
mary | 17 | 2015-6-30
mary | 12 | 2015-9-30
但是,我无法弄清楚如何选择基于季度的记录,比如2个季度之后(请记住,虽然数据可以追溯到20世纪70年代,但我并不是每个季度都有所以我错过了一些季度,如12/31/1987,2011年9月30日等):
SELECT * FROM mytable WHERE quarter >= (SELECT max(quarter) - interval '2 quarter' FROM mytable)
ERROR: invalid input syntax for type interval: "2 quarter"
编辑: 结束点始终相对于表格中的最大值(季度)...
答案 0 :(得分:0)
您可以定义一个功能,将日期转换为"季度" (即顺序整数),如下所示:
create function quarternum(d date) returns integer as $$
select extract(year from d)::integer*4 +
extract(quarter from d)::integer;
$$ language sql;
例如:
postgres=# select quarternum('2014-3-31');
quarternum
------------
8057
(1 row)
postgres=# select quarternum('2014-6-30'); -- next quarter gets +1 to its number
quarternum
------------
8058
(1 row)
使用此功能,您可以使用简单的整数数学,例如:克。
-- 2 quarters away
SELECT * FROM mytable
WHERE quarternum(quarter) >=
(SELECT quarternum(max(quarter)) - 2 FROM mytable)
此外,你可以使用quarternum(current_date)
而不是在桌子上计算max
。