如何 select 具有最低值的行 - oracle

How to select the row with the lowest value- oracle

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

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

select author
from   (
         select author
         from   your_table
         group  by author
         order  by count(*)
       )
where  rownum = 1
;

请注意,在子查询中我们不需要 select 计数(因为我们在输出中不需要它)。我们仍然可以在子查询的 order by 中使用它,这就是我们需要它的全部。

这里唯一棘手的部分是记住您需要对子查询中的行进行排序,然后在外部查询中应用 ROWNUM 过滤器。这是因为 ORDER BY 是在任何查询中处理的最后一件事 - 它在 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