Postgresql:仅显示最大值

时间:2017-03-22 21:06:20

标签: sql postgresql greatest-n-per-group

我有以下查询,它返回移动,容器名称和容器的cicle。容器上的cicle的最大值意味着它是实际的cicle。

select     des.movimiento, 
           des.equipo_identi, 
           max(des.ciclo) as ciclo
from       publico.descarga des
inner join publico.prioridad_movimiento primo 
on         des.movimiento = primo.movimiento
group by   des.movimiento, des.equipo_identi, primo.prioridad
order by   primo.prioridad

它给我这个

 movimiento    | equipo_identi | ciclo
--------------- --------------- --------
Descarga       | CBHU4329906   | 1 
Descarga       | CSLU1387094   | 2 
Descarga       | CSLU1407729   | 2 
GateOut Puerto | CBHU4329906   | 1 
GateOut Puerto | CSLU1387094   | 2 
GateOut Puerto | CSLU1407729   | 2 
GateIn Patio   | CBHU4329906   | 1 
GateIn Patio   | CSLU1387094   | 2 
GateIn Patio   | CSLU1407729   | 2 

我想要的是在最后一个动作( movimiento )上显示最后一个cicle( ciclo )。像这样,显示这3个不同的容器(表标题:equipo_identi ),最后一个动作是“GateIn Patio”:

  movimiento | equipo_identi | ciclo
------------- --------------- --------
GateIn Patio | CBHU4329906   | 1
GateIn Patio | CSLU1387094   | 2 
GateIn Patio | CSLU1407729   | 2 

为此,我有下表设置我的移动优先级。

表prioridad_movimiento

prioridad | movimiento
---------- ----------------
1         | Descarga
2         | GateOut Puerto
3         | GateIn Patio
4         | GateOut Patio
5         | GateIn Puerto
6         | Export

最高优先级为6,最小值为1.

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您只想在聚合后按优先级对结果进行排名:

select x.*
from (select des.movimiento, des.equipo_identi, max(des.ciclo) as ciclo,
             rank() over (order by primo.prioridad desc) as rnk
      from publico.descarga des inner join
           publico.prioridad_movimiento primo 
           on des.movimiento = primo.movimiento
      group by des.movimiento, des.equipo_identi, primo.prioridad
     ) x
where rnk = 1;