如何在 Oracle 的组中获得第三个 [重复]

Posted

技术标签:

【中文标题】如何在 Oracle 的组中获得第三个 [重复]【英文标题】:How to get third one in a group in Oracle [duplicate] 【发布时间】:2018-12-08 07:16:09 【问题描述】:

我有一个表,假设它有 3 个字段,它们是 f1、f2、f3,现在我想要一个 SQL 按 f1 和 f2 分组,然后按 ASC 或 DESC 顺序对每个组中的 f3 进行排序并查询出第三个f3中每组一个,SQL查询怎么写。例如:

f1    f2    f3
A     A     2
A     A     3
A     A     1
A     B     4
A     B     6
A     B     2

每组按ASC顺序,查询结果应该是这样的,得到第三个:

A     A     3
A     B     6

按DESC顺序在每组中,查询结果应该是这样的,得到第三个:

A     A     1
A     B     2

有没有办法在 Oracle 中查询表并得到类似上面的结果?

【问题讨论】:

【参考方案1】:

您可以使用row_number窗口函数对f3的每个值(每组f1f2)按升序或降序编号,然后查询第三个:

SELECT f1, f2, f3
FROM   (SELECT f1,
               f2,
               f3,
               ROW_NUMBER() OVER (PARTITION BY f1, f2 ORDER BY f3 ASC /* or desc */) AS rn
        FROM   mytable) t
WHERE  rn = 3

【讨论】:

【参考方案2】:

你可以尝试使用Rank窗口函数来制作。

SELECT f1, f2, f3
FROM   
(
    SELECT t1.*,
            RANK() OVER (PARTITION BY f1, f2 ORDER BY f3 ASC) AS rn
    FROM   T t1
) t1
WHERE rn = 3

【讨论】:

【参考方案3】:

这将起作用:

select * from (select f1,f2,f3,rank() over (partition by f1,f2 order by f3) 
as rank
from Table1 ) where rank=3;

【讨论】:

以上是关于如何在 Oracle 的组中获得第三个 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从未确定的组中获取第一个值

如果它出现在MYSQL中的组中,如何为每个值返回'true / false'?

如何从 JSPlumb 中的组中删除项目?

如何在 SQL Server 中按日期列排序的组中对列进行排名

如何在 C# 中将字符串中的所有内容捕获到单独的组中? [复制]

对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序