查询以查找每个组的第二大值

use*_*835 4 sql postgresql postgresql-9.3

我有三张桌子:

  1. project: project_id, project_name
  2. milestone: milestone_id, milestone_name
  3. project_milestone: id, project_id, milestone_id, completed_date

我希望从project_milestone按照project_id分组获得第二高的completed_date和milestone_id.那就是我想获得每个项目第二高的completed_date里程碑数.对此有什么正确的查询?

Gor*_*off 7

我想你可以用project_milestone桌子做你想做的事情row_number():

select pm.*
from (select pm.*,
             row_number() over (partition by project_id order by completed_date desc) as seqnum
      from project_milestone pm
      where pm.completed_date is not null
     ) pm
where seqnum = 2;
Run Code Online (Sandbox Code Playgroud)

如果您需要包括所有项目,即使没有两个里程碑的项目,您也可以使用left join:

select p.project_id, pm.milestone_id, pm.completed_date
from projects p left join
     (select pm.*,
             row_number() over (partition by project_id order by completed_date desc) as seqnum
      from project_milestone pm
      where pm.completed_date is not null
     ) pm
     on p.project_id = pm.project_id and pm.seqnum = 2;
Run Code Online (Sandbox Code Playgroud)