我如何 select 数学运算的最大值以及其他元素而不显示所有结果的最大值

How can I select the max for a maths operation and also other elements without the max displaying all results

我正在尝试找出某物的最大值,同时 select 还要考虑其他属性。当我自己执行 max 语句时,它按预期工作,但是当我 select 另一个属性时,它显示每个属性,就好像 max 语句不存在一样。我如何让它工作?

有效代码:

select max(contract_end - contract_start)
from contract 

编码 returns 所有数据,而不仅仅是最大值:

select contract_id, emp_name, job_desc, max(contract_end - contract_start)
from contract join employer on emp_id = contract_client
              join job on job_id = contract_job
group by contract_id, emp_name, job_desc

如果你想要整个 table 的最大值,那么只需 order byfetch first:

select c.contract_id, e.emp_name, j.job_desc, 
    c.contract_end - c.contract_start as contract_duration
from contract c
inner join employer e on e.emp_id = c.contract_client
inner join job j on j.job_id = c.contract_job
order by contract_duration desc
fetch first row with ties

with ties 允许顶部连接,如果有的话。

请注意,我添加了 table 别名并在所有列前添加了它们所属的 table 前缀(我做了一些猜测,您可能需要查看)。

fetch 子句在 Oracle 12 中可用。在早期版本中,您可以使用 window 函数代替:

select *
from (
    select c.contract_id, e.emp_name, j.job_desc, 
        c.contract_end - c.contract_start as contract_duration,
        rank() over(order by contract_duration desc) rn
    from contract c
    inner join employer e on e.emp_id = c.contract_client
    inner join job j on j.job_id = c.contract_job
) t
where rn = 1

最后:如果你想要最新的行 per group (这不是你的问题所暗示的),那么你可以只添加一个 partition by 子句到 rank(),枚举定义组的列。

按照我的阅读方式,您的查询 - 稍微修改一下,以便它在其 分析 形式中使用 MAX 函数 - 是否可以完成工作?

select contract_id, 
       emp_name, 
       job_desc, 
       max(contract_end - contract_start) over (order by null) max_end_start
from contract join employer on emp_id = contract_client
              join job on job_id = contract_job

或者,这就是您要找的东西吗?使用 MAX 日期差异作为子查询:

select contract_id, 
       emp_name, 
       job_desc,
       contract_end - contract_start diff
from contract join employer on emp_id = contract_client
              join job on job_id = contract_job
where contract_end - contract_start = (select max(contract_end - contract_start)
                                       from contract
                                      )