SQL 要求在 WHERE 子句中满足两个条件

SQL that requires two conditions be met in WHERE clause

我有 table 的鸟类观察资料。这是一个例子:

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 编写一个查询,它只会 return 同时出现啄木鸟 Downy 和 Hairy 的地点。在这个小例子 table 中,就是公园。其他地区只有其中一种。

我试过了

SELECT List_ID, LOCALITY, COMMON_NAME FROM table
WHERE COMMON_NAME = 'Downy Woodpecker' and COMMON_NAME = 'Hairy Woodpecker';

但是return没有结果。我的 table 有 1,000 次观察,它基于 eBird data 并且这两个物种在全国普遍存在,因此必须至少有一个 list_ID 它们同时出现时间。在我的示例 table 中,只有 Park(基于 list_ID 001)符合我要查找的条件。

如果我理解 IN,它会 return 满足任何一个的行。任何示例 list_IDs 都适用于该查询,但这不是我想要的。如何编写强制 WHERE 满足多个条件的查询?

您可以先编写一个查询,returns list_ids“拥有”两种类型的啄木鸟。 (按 list_id 分组并在 having 子句中写一个条件 return ids)。

类似

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

然后,您可以使用该查询来过滤您的基础 table,仅获取所需的 list_ids。

首先过滤table、group by Locality和return只包含这两种类型的地区:

select Locality
from tablename
where Common_name in ('Downy Woodpecker', 'Hairy Woodpecker')
group by Locality
having count(distinct Common_name) = 2

HAVING 子句中的条件 count(distinct Common_name) = 2 确保两种类型都存在于相同的 Locality.
如果在相同的 Locality 中没有重复 Common_name 的情况,您也可以从 count().
中省略 distinctdemo.
结果:

| locality |
| -------- |
| Park     |

您可以加​​入 table 自身来获取您想要的位置。例如:

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'