我有鸟类观察表。这是一个例子:
Unique_ID List_ID Locality Common_name
A1 001 Park Downy Woodpecker
A2 001 Park Hairy Woodpecker
A3 001 Park Carolina Chickadee
B1 002 Campground Blue Jay
B2 002 Campground Hairy Woodpecker
C1 003 Backyard Downy Woodpecker
C2 003 Backyard American Goldfinch
D1 004 School American Goldfinch
D2 004 School Hairy Woodpecker
E1 005 Park Downy Woodpecker
E2 005 Park Carolina Chickadee
我正在尝试为PostgreSQL编写一个查询,该查询将仅返回同时出现啄木鸟,Downy和Hairy的Localities。在小示例表中,那只是公园。其他地方只有一个或另一个物种。
我尝试过
SELECT List_ID, LOCALITY, COMMON_NAME FROM table
WHERE COMMON_NAME = 'Downy Woodpecker' and COMMON_NAME = 'Hairy Woodpecker';
但未返回任何结果。我的表有1000多个观测值,它基于eBird data,并且这两个物种在全国各地都很普遍,因此必须至少有一个list_ID同时出现。在我的示例表中,只有Park(基于list_ID 001)符合我要查找的条件。
如果我理解IN
,它将返回符合条件的一行。任何示例list_IDs都适用于该查询,但这不是我想要的。如何编写强制WHERE
满足多个条件的查询?
您可以首先编写一个查询,该查询返回“拥有”两种啄木鸟的list_ids。 (按list_id分组,并在hading子句中写入一个条件,该条件将返回ID)。
类似
max(case when common_name like ‘hairy%’ then 1 else 0 end) = 1
and max(case when common_name like ‘downy%’ then 1 else 0 end) = 1
然后,您可以使用该查询为所需的list_ids筛选基表。
您可以将表格与其自身连接以获得所需的位置。例如:
select distinct a.locality
from my_table a
join my_table b on a.locality = b.locality
where a.common_name = 'Downy Woodpecker'
and b.common_name = 'Hairy Woodpecker'
首先过滤表,group by Locality
,然后仅返回包含两种类型的位置:
select Locality
from tablename
where Common_name in ('Downy Woodpecker', 'Hairy Woodpecker')
group by Locality
having count(distinct Common_name) = 2
count(distinct Common_name) = 2
子句中的条件HAVING
确保同一Locality
的两种都存在。如果在同一Common_name
中没有重复的Locality
,则也可以从distinct
中省略count()
。参见demo。结果:
| locality |
| -------- |
| Park |