在没有日期的情况下获取最近的季度

时间:2017-10-16 15:09:06

标签: sql postgresql

我的任务是拉动最近四个季度的数据。如果我正在处理日期,这将很容易,但是当我有一个看起来像这样的宿舍表时,我不知道该怎么做:

| quarter | year |
+---------+------+
|    1    | 2016 |
|    2    | 2016 |
|    3    | 2016 |
         ...

我知道我可以通过这样的方式获得当前季度:

SELECT * 
FROM quarters
WHERE quarter = (EXTRACT(QUARTER FROM CURRENT_DATE)) 
   AND year = (EXTRACT(YEAR FROM CURRENT_DATE));

但是,我不确定获得最近四个季度的最佳方法。我想从去年开始这个季度,并从那时起选择所有内容,但我不知道如何用这样的元组做到这一点。我的预期结果将是:

| quarter | year |
+---------+------+
|    1    | 2017 |
|    2    | 2017 |
|    3    | 2017 |
|    4    | 2017 |

请记住,他们永远不会在同一年 - 在2018年第一季,这将会改变。

我已经建立了一个可以用来修补它的SQLFiddle - http://sqlfiddle.com/#!17/0561a/1

2 个答案:

答案 0 :(得分:3)

这是一种方法:

select quarter, year
from quarters
order by year desc, quarter desc
fetch first 4 rows only;

这假设quarters表中只有包含数据的四分之一(如您的样本数据所示)。如果表格中还有未来的季度,那么您需要将这些值与当前日期进行比较:

select quarter, year
from quarters
where year < extract(year from current_date) or
      (year = extract(year from current_date) and
       quarter <= extract(quarter from current_date)
      )
order by year desc, quarter desc
fetch first 4 rows only;

答案 1 :(得分:1)

对于可能存在缺口的情况,例如2/2017失踪,然后一个人只想返回四分之三而不是四分之一,可以将年份和季度变为连续数字,将年份乘以4并添加四分之三。

select *
from quarters
where year * 4 + quarter 
      between extract(year from current_date) * 4 + extract(quarter from current_date) - 3
          and extract(year from current_date) * 4 + extract(quarter from current_date)
order by year desc, quarter desc;