Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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 如何选择值最低的行-oracle_Sql_Oracle_Sql Limit - Fatal编程技术网

Sql 如何选择值最低的行-oracle

Sql 如何选择值最低的行-oracle,sql,oracle,sql-limit,Sql,Oracle,Sql Limit,我有一个保存作者和歌曲以及其他列的表。同一首歌可以出现多次,而且显然总是出自同一作者。我想选择的作者,有最少的歌曲,包括重复的,又名一个是听最少的。 最后一个表格应该只显示一个作者姓名。显然,一个步骤是找到每个作者的计数。这可以通过基本聚合查询完成。然后,如果您按计数订购,并且您可以只选择第一行,这将解决您的问题。一种方法是在外部查询中使用ROWNUM。这是一种非常基本的方法,非常有效,适用于Oracle的所有版本(它不使用任何高级功能) 请注意,在子查询中,我们不需要选择计数(因为我们在输出中

我有一个保存作者和歌曲以及其他列的表。同一首歌可以出现多次,而且显然总是出自同一作者。我想选择的作者,有最少的歌曲,包括重复的,又名一个是听最少的。
最后一个表格应该只显示一个作者姓名。

显然,一个步骤是找到每个作者的计数。这可以通过基本聚合查询完成。然后,如果您按计数订购,并且您可以只选择第一行,这将解决您的问题。一种方法是在外部查询中使用ROWNUM。这是一种非常基本的方法,非常有效,适用于Oracle的所有版本(它不使用任何高级功能)

请注意,在子查询中,我们不需要选择计数(因为我们在输出中不需要它)。我们仍然可以在子查询中按顺序使用它,这就是我们所需要的


这里唯一棘手的部分是要记住,您需要对子查询中的行进行排序,然后在外部查询中应用ROWNUM过滤器。这是因为ORDERBY是在任何查询中处理的最后一件事——它发生在ROWNUM分配给输出中的行之后。因此,将WHERE子句移动到子查询中(并在单个查询中执行所有操作,而不是子查询和外部查询)不起作用

您可以使用如下分析函数:

Select * from
(Select t.*,
       Row_number() over (partition by song order by cnt_author) as rn
  From
(Select t.*,
       Count(*) over (partition by author) as cnt_author
  From your_table t) t ) t
 Where rn = 1

请提供示例数据和所需结果。另外:您的Oracle版本是什么(例如,在Oracle 12.1及更高版本中,您可以执行一些在早期版本中无法执行的操作);还有,你的知识水平。显然这是一种家庭作业;为了帮助你,我们需要知道你在课堂上涵盖了多少内容。如果你给你一个简单、优雅、高效的解决方案,那你就没有什么好处了。你还需要在课堂上还没有覆盖的高级功能。我不理解的副本——为什么你需要在中间查询中按歌曲进行分区?这和问题有什么关系?非常感谢!我肯定是把我的代码复杂化了,但这非常有效
Select * from
(Select t.*,
       Row_number() over (partition by song order by cnt_author) as rn
  From
(Select t.*,
       Count(*) over (partition by author) as cnt_author
  From your_table t) t ) t
 Where rn = 1