如果与上一列匹配,则PostgreSQL的年龄增加一

时间:2019-03-27 07:17:35

标签: sql postgresql

我有一张桌子,如下表

    id    |    dob     |   date     
----------+------------+-----------
     1    | 22/09/2009 | 28/10/2014
     1    | 22/09/2009 | 25/11/2014
     1    | 22/09/2009 | 16/12/2014
     2    | 08/01/2010 | 30/09/2014
     2    | 08/01/2010 | 03/10/2014

我正在通过Postgres中的以下代码计算年龄(以月为单位)

SELECT id, ((EXTRACT(year FROM age(date,dob)) :: int) * 12) + (EXTRACT(month FROM age(date,dob))) FROM exmpleTable

结果如下

    id    |    age          
----------+------------
     1    |     61 
     1    |     62 
     1    |     62 
     2    |     56
     2    |     56 

“日期”是每月唯一的。因此,两个日期不会在同一个月内发生。 现在我需要以下结果

    id    |    age          
----------+------------
     1    |     61 
     1    |     62 
     1    |     63 
     2    |     56
     2    |     57

逻辑:

任何一个

1)如果计算出的年龄与上述年龄相同,则加一(我不确定如何使用滞后)

OR

2)可以使用与“日期”相同月份的月底日期,以确保不会重复以月为单位的年龄

或其他逻辑

有没有办法做到这一点

1 个答案:

答案 0 :(得分:2)

使用lag()

DEMO

with cte as 
(
SELECT id, ((EXTRACT(year FROM age(date,dob)) :: int) * 12) + (EXTRACT(month FROM age(date,dob))) as age FROM exmpleTable
)

select id, case when age=lag(age) over(order by id) then age+1 else age end as ageval
from cte

输出:

id  age
1   61
1   62
1   63
2   56
2   57