【问题标题】:Postgresql: Show only the max valuePostgresql:仅显示最大值
【发布时间】:2017-03-22 21:06:19
【问题描述】:

我有以下查询,它返回我的移动、容器的名称和容器的 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)。像这样,显示最后一个动作是“GateIn Patio”的这3个不同的容器(table title:equipo_identi):

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

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

表格优先级_movimiento

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

最高优先级为 6,最低优先级为 1。

【问题讨论】:

  • 你能解释一下需求的逻辑吗?为什么要获取 movimiento = 'GateIn Patio' 的所有行?
  • @GiorgosAltanis 因为我只需要查看它具有容器的最后一个动作的最后一个 cicle,所以这些动作可以是列出的 6 个中的任何一个。
  • 我不确定我是否理解;如果您只需要查看最后一个动作的最后一个循环,为什么您期望最后一个动作的所有三行而不是一个? [而这只是我不明白的事情之一]
  • @GiorgosAltanis 因为,这三行中的每一行都显示了不同容器的最后移动。那是因为它显示 3,这意味着有 3 个容器具有实际运动“GateIn Patio”。
  • 所以容器是equipo_identi?

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


【解决方案1】:

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

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;

【讨论】:

  • 是的,我已经测试了您的查询,第一印象看起来正是我想要的。我将添加更多数据信息以进行测试。到目前为止,这是正确的答案。
  • 有一个额外的问题,关于如何根据 varchar 和 bigint(aggregation max) 字段忽略值的任何提示?
  • @Jorge 。 . .我不明白你的问题。问题应作为问题提出,并附有样本数据、预期结果和解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多