Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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_Greatest N Per Group - Fatal编程技术网

Sql 如何在Oracle中获得团队中的第三名

Sql 如何在Oracle中获得团队中的第三名,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有一个表,假设它有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

我有一个表,假设它有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
按照每组中的描述顺序,查询结果应如下所示,获取第三个:

A     A     1
A     B     2

有没有一种方法可以在Oracle中查询该表并获得上述结果?

您可以尝试使用
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

您可以尝试使用
Rank
window函数进行设置

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

您可以使用
row\u number
窗口函数按升序或降序对
f3
(每组
f1
f2
)的每个值进行编号,然后查询第三个值:

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

您可以使用
row\u number
窗口函数按升序或降序对
f3
(每组
f1
f2
)的每个值进行编号,然后查询第三个值:

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
这将有助于:

select * from (select f1,f2,f3,rank() over (partition by f1,f2 order by f3) 
as rank
from Table1 ) where rank=3;
这将有助于:

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