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