SQL中的候选匹配

SQL中的候选匹配,sql,postgresql,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 ann

我的数据库中有下表

# 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,排名>5)和(prop=3,排名>=8)

示例1

输入:

结果:

示例2

输入:

结果:

示例3

输入:

结果:

示例4

输入:

结果:

如何在SQL中执行此操作?

EX1:

SELECT    name
FROM      matches 
WHERE     (prop=3 AND rank > 4) OR (prop=4 AND rank > 16) 
SELECT    name 
FROM      matches 
WHERE     (prop=1 AND rank > 6) OR (prop=2 AND rank > 4) 
EX2:

SELECT    name
FROM      matches 
WHERE     (prop=3 AND rank > 4) OR (prop=4 AND rank > 16) 
SELECT    name 
FROM      matches 
WHERE     (prop=1 AND rank > 6) OR (prop=2 AND rank > 4) 
等等……:-)

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


这应该同时处理一个属性的多行和属性的缺失值。

?如果他是一个初学者?这不是那么简单,我想你误解了我的问题。这不是小事,但它是重复的。改进您的第一个问题,而不是发布重复。是的,但是(道具=3且排名>4)或(道具=4且排名>16)将返回Alex Alex Anna 1。重复,2。安娜和亚历克斯都不符合要求
(prop=1 AND rank > 2), (prop=2 AND rank > 2) 
name
-----
carl
alex
(prop=3 AND rank > 7)
name
----
carl
alex
anna
SELECT    name
FROM      matches 
WHERE     (prop=3 AND rank > 4) OR (prop=4 AND rank > 16) 
SELECT    name 
FROM      matches 
WHERE     (prop=1 AND rank > 6) OR (prop=2 AND rank > 4) 
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