我在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=1
和A=2
只存在一次。
对于A=3
,我必须构建一个查询来识别数据集,该数据集将位于最终列表中。应该适用一些规则:
B
的数据集;如果不是那么明显C
的数据集;如果不是那么明显D
的数据集。在上面的示例中,应该采用数据集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
- HAVING
和EXISTS
(或NOT EXISTS
)语句,但我的SQL知识还不够。
答案 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