Sql 如何在oracle select中按等级或秒获取第一个值

Sql 如何在oracle select中按等级或秒获取第一个值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我使用rank()对(按ASC按顺序划分)Function进行排名。它工作得很好。但是,如果特定的应用程序id的最大rnk值为1,则我需要取1stfalue,否则2nd1 表是这样的 APPLICATION_ID | EMP_CODE | DATE_ACTION | ACTION_ID ---------------------------------------------------------------- 24744 | 110147

我使用
rank()对(按ASC按顺序划分)
Function进行排名。它工作得很好。但是,如果特定的
应用程序id
的最大rnk值为1,则我需要取1stfalue,否则2nd1

表是这样的

  APPLICATION_ID    |  EMP_CODE   | DATE_ACTION   | ACTION_ID
----------------------------------------------------------------
    24744           |  110147     | 2016-09-13    | -1
    24746           |  162286     | 2016-09-12    |  0 
我的选择如下:

SELECT APPLICATION_ID,EMP_CODE,DATE_ACTION,ACTION_ID,
           rank() OVER (PARTITION BY APPLICATION_ID
                  ORDER BY DATE_ACTION ASC) as rnk
FROM TABLE WHERE ACTION_ID = -1
结果是:

RNK  | APPLICATION_ID    |  EMP_CODE   | DATE_ACTION   | ACTION_ID
------------------------------------------------------------
1    | 53207             | 260829      | 2020-03-03    | -1
2    | 53207             | 161938      | 2020-03-03    | -1
3    | 53207             | 161938      | 2020-03-03    | -1
1    | 51372             | 163668      | 2020-03-04    | -1
1    | 52819             | 260829      | 2020-03-02    | -1
2    | 52819             | 161938      | 2020-03-02    | -1
3    | 52819             | 161938      | 2020-03-02    | -1
4    | 52819             | 161938      | 2020-03-02    | -1
但结果应该是这样的:

RNK  | APPLICATION_ID    |  EMP_CODE   | DATE_ACTION   | ACTION_ID
------------------------------------------------------------
2    | 53207             | 161938      | 2020-03-03    | -1
1    | 51372             | 163668      | 2020-03-04    | -1
2    | 52819             | 161938      | 2020-03-02    | -1

SELECT t.APPLICATION_ID, t.EMP_CODE, t.DATE_ACTION, t.ACTION_ID
FROM (
  SELECT APPLICATION_ID,EMP_CODE,DATE_ACTION,ACTION_ID,
    RANK() OVER (PARTITION BY APPLICATION_ID ORDER BY DATE_ACTION DESC) as rnk,
    COUNT(*) OVER (PARTITION BY APPLICATION_ID) counter
  FROM tablename WHERE ACTION_ID = -1
) t
WHERE t.rnk = CASE WHEN t.counter = 1 THEN 1 ELSE 2 END
您可以像这样使用
COUNT()
分析函数:

RNK  | APPLICATION_ID    |  EMP_CODE   | DATE_ACTION   | ACTION_ID
------------------------------------------------------------
2    | 53207             | 161938      | 2020-03-03    | -1
1    | 51372             | 163668      | 2020-03-04    | -1
2    | 52819             | 161938      | 2020-03-02    | -1

SELECT t.APPLICATION_ID, t.EMP_CODE, t.DATE_ACTION, t.ACTION_ID
FROM (
  SELECT APPLICATION_ID,EMP_CODE,DATE_ACTION,ACTION_ID,
    RANK() OVER (PARTITION BY APPLICATION_ID ORDER BY DATE_ACTION DESC) as rnk,
    COUNT(*) OVER (PARTITION BY APPLICATION_ID) counter
  FROM tablename WHERE ACTION_ID = -1
) t
WHERE t.rnk = CASE WHEN t.counter = 1 THEN 1 ELSE 2 END

更新了我的问题。我只是把我的查询结果放在这里。检查我的答案。