我的数据库中有以下表格。
# select * FROM matches;
name | prop | rank
------+------+-------
carl | 1 | 4
carl | 2 | 3
carl | 3 | 9
alex | 1 | 8
alex | 2 | 5
alex | 3 | 6
alex | 3 | 8
alex | 2 | 11
anna | 3 | 8
anna | 3 | 13
anna | 4 | 14
(11 rows)
每个人都被称为“道具”的不同属性/标准在工作中排名,并且表现被称为“等级”。该表包含多个(name,prop)值,如示例所示。
我希望得到满足所有要求的候选人:拥有(prop = 1 AND rank> 5)和(prop = 3 AND rank> = 8)。
示例1
输入:
(prop=3 AND rank > 4), (prop=4 AND rank > 16)
结果:
name
-----
(none)
示例2
输入:
(prop=1 AND rank > 6), (prop=2 AND rank > 4)
结果:
name
-----
alex
示例3
输入:
(prop=1 AND rank > 2), (prop=2 AND rank > 2)
结果:
name
-----
carl
alex
示例4
输入:
(prop=3 AND rank > 7)
结果:
name
----
carl
alex
anna
如何在SQL中执行此操作?
答案 0 :(得分:1)
drop table if exists matches;
create table matches (name varchar, prop int, rank int);
insert into matches values
('carl' , 1 , 4),
('carl' , 2 , 3),
('carl' , 3 , 9),
('alex' , 1 , 8),
('alex' , 2 , 5),
('alex' , 3 , 6),
('alex' , 3 , 8),
('alex' , 2 , 11),
('anna' , 3 , 8),
('anna' , 3 , 13),
('anna' , 4 , 14);
select
name
from
matches
group by
name
having
sum((prop=1 AND rank > 2)::int) > 0 and
sum((prop=2 AND rank > 2)::int) > 0
这应该处理一个属性的多行和属性的缺失值。
答案 1 :(得分:-1)
<强> EX1:强>
SELECT name
FROM matches
WHERE (prop=3 AND rank > 4) OR (prop=4 AND rank > 16)
<强> EX2:强>
SELECT name
FROM matches
WHERE (prop=1 AND rank > 6) OR (prop=2 AND rank > 4)
等......: - )
或者您想要在一个查询中检索所有示例数据(我认为您不想阅读您的问题)?