如何限制每个值的行数?

问题描述

这是我的示例数据。


Date         Name    Subject         Importance    Location     Time      rating
12/08/2020   David   Work            1             London       -         -
1/08/2020    David   Work            3             London       23.50     4
2/10/2018    David   Emails          3             New York     18.20     3
12/08/2020   George  Updates         2             New York     -         -
1/08/2019    George  New Appointments5             London       55.10     2
2/10/2019    David   Emails          3             Paris        18.58     3
8/09/2017    David   Emails          2             Paris        18.90     5

我需要能够看到明天的会议以及我与每个客户进行的前3次会议。因此,将按名称排序,然后按日期将每个名称的条目限制为3。有人可以指出正确的方向吗?

预期结果将是

Date         Name    Subject         Importance    Location     Time      rating
12/08/2020   David   Work            1             London       -         -
1/08/2020    David   Work            3             London       23.50     4
2/10/2018    David   Emails          3             New York     18.20     3
2/10/2019    David   Emails          3             Paris        18.58     - 
12/08/2020   George  Updates         2             New York     -         -
1/08/2019    George  New Appointments5             London       55.10     2

解决方法

您可以使用窗口功能来计算“明天”的下三个会议的数量。然后进行一些过滤:

select t.*
from (select t.*,count(*) filter (where date = current_date + interval '1 day') over
                 (partition by name
                  order by date
                  rows between 1 following and 3 following
                 ) as cnt_tomorrow
      from t
     ) t
where date = current_date + interval '1 day' or
      cnt_tomorrow > 0
order by name,date;

Here是db 小提琴。