减少结果列表(SQL)

时间:2015-12-15 11:37:24

标签: sql informix

我在2天后坚持使用SQL语句,我希望你能帮助我。

我的选择结果是一个包含4个属性A,B,C和D的列表(下面是5个数据集的示例列表):

 1. A=1 B=100 C=200 D=300
 2. A=2 B=200 C=100 D=300
 3. A=3 B=300 C=200 D=100
 4. A=3 B=100 C=100 D=200
 5. A=3 B=300 C=100 D=200

列表应该减少,以便每个属性A只在列表中一次。

在上面的示例中,数据集1.和2.应该在列表中,因为A=1A=2只存在一次。

对于A=3,我必须构建一个查询来识别数据集,该数据集将位于最终列表中。应该适用一些规则:

  1. 获取具有最高值B的数据集;如果不是那么明显
  2. 获取具有最高值C的数据集;如果不是那么明显
  3. 获取具有最高值D的数据集。
  4. 在上面的示例中,应该采用数据集3.

    预期结果是:

    1.A=1 B=100 C=200 D=300
    2.A=2 B=200 C=100 D=300
    3.A=3 B=300 C=200 D=100
    

    我希望你理解我的问题。我尝试了各种版本的SELECT - HAVINGEXISTS(或NOT EXISTS)语句,但我的SQL知识还不够。

4 个答案:

答案 0 :(得分:1)

这种类型的优先级查询最容易使用row_number()完成,但我不认为Informix支持它。

因此,一种方法是使用相关子查询枚举行:

select t.*
from (select t.*,
             (select count(*)
              from t t2
              where (t2.b > t.b) or
                    (t2.b = t.b and t2.c > t.c) or
                    (t2.b = t.b and t2.c = t.c and t2.d > t.d)
             ) as NumGreater
      from t
     ) t
where NumGreater = 0;

答案 1 :(得分:1)

可能有一种更简单的方法可以解决这个问题,但是这个方法有效:

CREATE TEMP TABLE TEST (
A INTEGER,
B INTEGER,
C INTEGER,
D INTEGER
);

insert into TEST values (1,1,1,1);
insert into TEST values (2,1,5,1);
insert into TEST values (2,2,1,1);
insert into TEST values (3,1,4,1);
insert into TEST values (3,2,1,4);
insert into TEST values (3,2,3,1);
insert into TEST values (3,3,1,5);
insert into TEST values (3,3,2,3);
insert into TEST values (3,3,2,7);
insert into TEST values (3,3,3,1);
insert into TEST values (3,3,3,2);

select distinct
t1.A,
t2.B as B,
t3.C as C,
t4.D as D
from TEST t1 
join (select A ,MAX (B) as B from TEST group by A)t2 on t2.A=t1.A
join (select A, B, MAX(C) as C from TEST group by A,B)t3 on t3.A=t2.A and t3.B=t2.B
join (select A, B, C, MAX (D) as D  from TEST group by A,B,C)t4 on t4.A=t3.A and t4.B=t3.B and t4.C=t3.C;

结果:

a   b   c   d
1   1   1   1
2   2   1   1
3   3   3   2

在IBM Informix Dynamic Server版本11.10.FC3上测试。

答案 2 :(得分:0)

我不知道Informix但您可以尝试。这适用于Sql Server。也许它也适用于Informix

select * from tablename t1
where id = (select first 1 id from tablename t2 
            where t2.A = t1.A order by B desc, C desc, D desc)

答案 3 :(得分:-1)

SELECT A, MAX(B) AS B, MAX(C) AS C, MAX(D) AS D
  FROM table_name
 GROUP BY A