如何获得满足最多条件的行

时间:2016-10-29 13:46:42

标签: sql oracle oracle11g

我有桌子:

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);

2 个答案:

答案 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行也满足条件时?