如何在不显示所有结果的最大值的情况下为数学运算以及其他元素选择最大值

Posted

技术标签:

【中文标题】如何在不显示所有结果的最大值的情况下为数学运算以及其他元素选择最大值【英文标题】:How can I select the max for a maths operation and also other elements without the max displaying all results 【发布时间】:2021-03-26 01:24:52 【问题描述】:

我试图找到某物的最大值,同时还选择其他属性。当我自己执行 max 语句时,它会按预期工作,但是当我选择另一个属性时,它会显示每个属性,就好像 max 语句不存在一样。我如何让它发挥作用?

有效的代码:

select max(contract_end - contract_start)
from contract 

返回所有数据的代码,而不仅仅是最大值:

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

【问题讨论】:

【参考方案1】:

按照我的阅读方式,您的查询 - 稍作修改,以便它以 分析 形式使用 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
                                      )   

【讨论】:

选择了所有 max_end_start 值都设置为最大值的行,我只想要数据最高的一行 我又加了一个例子;看看有没有帮助。【参考方案2】:

如果您想要整个表格的最大值,那么只需 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 允许***别(如果有)。

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

fetch 子句在 Oracle 12 中可用。在早期版本中,您可以改用窗口函数:

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

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

【讨论】:

当我只想要最高的时候返回多行? @anotherwildeboy:这给出了一行,最大值。如果具有最大值的行不止一行,则它给出多行。尝试查询并自己查看。

以上是关于如何在不显示所有结果的最大值的情况下为数学运算以及其他元素选择最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用distinct的情况下显示唯一记录?

当我的搜索字段为空时,如何在不搜索结果的情况下呈现页面,但在搜索时仍然异步呈现?

如何在不单独指定所有列的情况下对所有列的 SQL 结果进行排序?

如何在不知道百分比的情况下在 Qt 中显示“无限浮动”进度条?

在不使用 + 运算符的情况下添加两个数字的最佳方法是啥?

如何在不更改边框的情况下进行css更改以显示所有表格内容?