如何在 oracle select 中按等级或第二取第一个值
how to take first value by rank or second in oracle select
我使用rank() OVER (PARTITION BY ? ORDER BY ? ASC)
函数进行排名。它工作正常。但是如果特定 application_id
的最大 rnk 值为 1,我需要取 1st falue 否则 2nd 一个。
TABLE是这样的
APPLICATION_ID | EMP_CODE | DATE_ACTION | ACTION_ID
----------------------------------------------------------------
24744 | 110147 | 2016-09-13 | -1
24746 | 162286 | 2016-09-12 | 0
我的Select如下:
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
你也可以像这样使用COUNT()
解析函数:
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
我使用rank() OVER (PARTITION BY ? ORDER BY ? ASC)
函数进行排名。它工作正常。但是如果特定 application_id
的最大 rnk 值为 1,我需要取 1st falue 否则 2nd 一个。
TABLE是这样的
APPLICATION_ID | EMP_CODE | DATE_ACTION | ACTION_ID
----------------------------------------------------------------
24744 | 110147 | 2016-09-13 | -1
24746 | 162286 | 2016-09-12 | 0
我的Select如下:
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
你也可以像这样使用COUNT()
解析函数:
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