如何编写查询以获取此类输出?

时间:2019-03-29 14:06:50

标签: sql postgresql window-functions

我希望将Pdate列作为输出。 我具有以下三个属性:id,奖金和日期。我必须获得date列的输出,以便该列显示员工收到20欧元或20欧元以上的正常日期(对应于员工获得奖金的正常日期)。请看下表,以进一步了解该问题:

id Bonus    Date           my_output     Pdate(Required Output)
1   15  "2017-06-20"                    "2017-04-17"
1   10  "2017-05-22"                    "2017-04-17"
1   20  "2017-04-17"    "2017-04-17"    "2017-03-20"
1   20  "2017-03-20"    "2017-03-20"     NULL
2   15  "2017-02-20"                    "2017-01-28"
2   25  "2017-01-28"    "2017-01-28"     NULL

因此,正如您在第一行看到的那样,奖金为15,因为我们希望奖金大于或等于20,所以在“ 2017-04-17”,对于id 1,奖金为20。因此,Pdate具有日期。并且在第四行中,由于没有根据用户1的条件获得奖励的先前日期,因此pdate为null。

select id,Bonus_value as Bonus,
(case when Bonus_value>=0 then Bonus_date end) as date,
(case when Bonus_value>=20 then Bonus_date end) as my_output                                     
from Bonus                                       
group by id,Bonus_value,Bonus_date
order by id,Bonus_date desc

在此代码中,没有pdate,因为我不知道如何获取该列。这就是我想要的。我想到了使用lead()窗口函数,但我仍然不知道如何将其与日期列相对应。

1 个答案:

答案 0 :(得分:0)

在标准SQL中,您可以使用ignore null s选项:

select t.*,
       lag(case when bonus >= 20 then date end ignore nulls) over (partition by id order by date) as pdate
from t;

并非所有数据库都支持此选项,因此您也可以将max()与window子句一起使用:

       max(case when bonus >= 20 then date end ignore nulls) over (partition by id order by date rows between unbounded preceding and 1 preceding) as pdate
from t;