Sql 如何从表中选择相似记录的最大数量
我在Oracle中有两个表 航班: 乘客:Sql 如何从表中选择相似记录的最大数量,sql,oracle,Sql,Oracle,我在Oracle中有两个表 航班: 乘客: 现在我需要展示一下乘客最多的航班。但我就是搞不懂这个问题。有人能帮我吗?您可以使用分析函数将查询简化为一次表扫描:以提高查询运行的速度 select * from (select fl_no, num_pass, dense_rank() over(order by num_pass desc) as rnk from (select fl_no, count(*) a
现在我需要展示一下乘客最多的航班。但我就是搞不懂这个问题。有人能帮我吗?您可以使用分析函数将查询简化为一次表扫描:以提高查询运行的速度
select *
from (select fl_no,
num_pass,
dense_rank() over(order by num_pass desc) as rnk
from (select fl_no, count(*) as num_pass
from passenger
group by fl_no))
where rnk = 1
小提琴:
注意我是如何在小提琴中在1号航班和3号航班之间打成平局的;两个航班都有3名乘客,是所有航班中乘客最多的
如前所述,如果需要从该表返回其他字段,请加入flight表。例如,如果您想添加您可以运行的乘客最多的航班的日期:
select x.*, f.fl_date
from (select fl_no,
num_pass,
dense_rank() over(order by num_pass desc) as rnk
from (select fl_no, count(*) as num_pass
from passenger
group by fl_no)) x
join flight f
on x.fl_no = f.fl_no
where rnk = 1
Fiddle:您可以使用分析函数将查询减少为一次表扫描:以提高查询运行的速度
select *
from (select fl_no,
num_pass,
dense_rank() over(order by num_pass desc) as rnk
from (select fl_no, count(*) as num_pass
from passenger
group by fl_no))
where rnk = 1
小提琴:
注意我是如何在小提琴中在1号航班和3号航班之间打成平局的;两个航班都有3名乘客,是所有航班中乘客最多的
如前所述,如果需要从该表返回其他字段,请加入flight表。例如,如果您想添加您可以运行的乘客最多的航班的日期:
select x.*, f.fl_date
from (select fl_no,
num_pass,
dense_rank() over(order by num_pass desc) as rnk
from (select fl_no, count(*) as num_pass
from passenger
group by fl_no)) x
join flight f
on x.fl_no = f.fl_no
where rnk = 1
Fiddle:我会使用order by和rownum执行此操作:
虽然可以使用窗口函数,但它们似乎有些过分
请注意,在Oracle 12+中,这可以简化为:
select fl_no, count(*) as cnt
from passenger p
group by fl_no
order by cnt desc
fetch first 1 row only;
编辑:
如果你想要所有这样的飞行,那么解析函数就是最好的选择。下面是编写此类查询的另一种方法Brian已经有了一种方法:
select *
from (select fl_no, count(*) as cnt, max(count(*)) over () as maxcnt
from passenger p
group by fl_no
order by cnt desc
) f
where cnt = maxcnt;
我将使用order by和rownum执行此操作:
虽然可以使用窗口函数,但它们似乎有些过分
请注意,在Oracle 12+中,这可以简化为:
select fl_no, count(*) as cnt
from passenger p
group by fl_no
order by cnt desc
fetch first 1 row only;
编辑:
如果你想要所有这样的飞行,那么解析函数就是最好的选择。下面是编写此类查询的另一种方法Brian已经有了一种方法:
select *
from (select fl_no, count(*) as cnt, max(count(*)) over () as maxcnt
from passenger p
group by fl_no
order by cnt desc
) f
where cnt = maxcnt;
到目前为止,您的查询是什么样子的?其结果应如何不同?请进一步阅读您请求标题表中的类似记录,或在适当情况下重新措辞。如果多个航班的最大乘客人数相同,您希望发生什么?显示两个,随机选择一个,或者根据一些次要条件选择一个?同时显示两个航班到目前为止您的查询是什么样子的?其结果应如何不同?请进一步阅读您请求标题表中的类似记录,或在适当情况下重新措辞。如果多个航班的最大乘客人数相同,您希望发生什么?显示两个,随机选择一个,或者根据一些次要标准选择一个?显示两个航班这实际上并不是OP想要的。他们希望显示所有拥有最高计数的航班。这实际上并不符合OP的要求。希望显示所有具有最高计数的航班。