C1 | C2 | C3 |
---|---|---|
1 | 一個 | 1000 |
1 | 乙 | 2000 |
1 | C | 3000 |
1 | D | 4000 |
1 | 乙 | 5000 |
2 | 一個 | 1000 |
2 | D | 4000 |
2 | 乙 | 5000 |
3 | 一個 | 1000 |
3 | 乙 | 2000 |
3 | D | 4000 |
3 | 乙 | 5000 |
我想過濾C2
到 的值B
,但是如果B
不存在,那么我需要C
,如果C
不存在,那么我需要D
所以結果將如下所示:
C1 | C2 | C3 |
---|---|---|
1 | 乙 | 2000 |
2 | D | 4000 |
3 | 乙 | 2000 |
uj5u.com熱心網友回復:
使用RANK
分析函式(如果要在組中有多個B
值時包含重復行c1
,否則ROW_NUMBER
對單行使用分析函式),然后過濾以僅包含每個磁區中的第一個排名:
SELECT c1, c2, c3
FROM (
SELECT t.*,
RANK() OVER (PARTITION BY c1 ORDER BY c2) AS rnk
FROM table_name t
WHERE c2 IN ('B', 'C', 'D')
)
WHERE rnk = 1;
其中,對于樣本資料:
CREATE TABLE table_name (C1, C2, C3) AS
SELECT 1, 'A', 1000 FROM DUAL UNION ALL
SELECT 1, 'B', 2000 FROM DUAL UNION ALL
SELECT 1, 'C', 3000 FROM DUAL UNION ALL
SELECT 1, 'D', 4000 FROM DUAL UNION ALL
SELECT 2, 'A', 1000 FROM DUAL UNION ALL
SELECT 2, 'D', 4000 FROM DUAL UNION ALL
SELECT 2, 'E', 5000 FROM DUAL UNION ALL
SELECT 3, 'A', 1000 FROM DUAL UNION ALL
SELECT 3, 'B', 2000 FROM DUAL UNION ALL
SELECT 3, 'D', 4000 FROM DUAL UNION ALL
SELECT 3, 'E', 5000 FROM DUAL;
輸出:
C1 | C2 | C3 |
---|---|---|
1 | 乙 | 2000 |
2 | D | 4000 |
3 | 乙 | 2000 |
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506881.html