Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从表中选择相似记录的最大数量_Sql_Oracle - Fatal编程技术网

Sql 如何从表中选择相似记录的最大数量

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

我在Oracle中有两个表

航班:

乘客:


现在我需要展示一下乘客最多的航班。但我就是搞不懂这个问题。有人能帮我吗?

您可以使用分析函数将查询简化为一次表扫描:以提高查询运行的速度

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的要求。希望显示所有具有最高计数的航班。