SQL中的候选匹配

时间:2014-06-18 13:18:35

标签: sql postgresql

我的数据库中有以下表格。

# 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中执行此操作?

2 个答案:

答案 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) 

等......: - )

或者您想要在一个查询中检索所有示例数据(我认为您不想阅读您的问题)?