我有桌子:
ID COD1 COD2 COD3 COD4 VAR1 VAR2 VAR3
-- ---- ---- ---- ---- ---- ---- ----
1 ABC AB NULL NULL 1 2 3
2 NULL NNN NULL AAA 2 4 5
3 ABC AB PP AAA 3 2 4
4 ABC AB PP AAA 1 3 4
我需要获得满足大多数条件的行(COD列)
示例1:获取COD1 = ABC,COD2 = AB,COD3 = AAA且COD4 = BBB的所有行,必须返回第1行
示例2:获取COD1 = ABC,COD2 = AB,COD3 = PP和COD4 = AAA的所有行,必须返回第3行和第4行
见下面的DDL和DML:
CREATE TABLE TEST_TEST AS
(
ID NUMBER,
COD1 VARCHAR2(100),
COD2 VARCHAR2(100),
COD3 VARCHAR2(100),
COD4 VARCHAR2(100),
VAR1 NUMBER,
VAR2 NUMBER,
VAR3 NUMBER
);
INSERT INTO TEST_X (ID, COD1, COD2, COD3, COD4, VAR1, VAR2, VAR3) VALUES (1, 'ABC', 'AB', NULL, NULL, 1, 2, 3);
INSERT INTO TEST_X (ID, COD1, COD2, COD3, COD4, VAR1, VAR2, VAR3) VALUES (2, NULL, 'NNN', NULL, 'AAA', 2, 4, 5);
INSERT INTO TEST_X (ID, COD1, COD2, COD3, COD4, VAR1, VAR2, VAR3) VALUES (3, 'ABC', 'AB', 'PP', 'AAA', 3, 2, 4);
INSERT INTO TEST_X (ID, COD1, COD2, COD3, COD4, VAR1, VAR2, VAR3) VALUES (4, 'ABC', 'AB', 'PP', 'AAA', 1, 3, 4);
答案 0 :(得分:3)
我想你想要这样的东西:
select t.*
from (select t.*
dense_rank() over
(order by ((case when cod1 = 'ABC' then 1 else 0 end) +
(case when cod2 = 'AB' then 1 else 0 end) +
(case when cod3 = 'AAA' then 1 else 0 end) +
(case when cod4 = 'BBB' then 1 else 0 end)
) desc
) as seqnum
from t
)
where seqnum = 1;
如果您只想要一行关系,请将dense_rank()
更改为row_number()
。
答案 1 :(得分:1)
在你的问题中,你说: 例3:获取COD1 = ABC,COD2 = AB,COD3 = PP和COD4 = AAA的所有行,必须返回第4行,
为什么它只会检索第4行,当第3行也满足条件时?