我如何 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 by
和 fetch 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
)
我正在尝试找出某物的最大值,同时 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 by
和 fetch 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
)