我有一个问题,我在 PostgreSQL 中有一个表,我需要执行一个查询来检索一些数据。
问题是,我只需要选择每个物种的 1 个生物体,但每个基因组在同一物种下都有不同的类别,例如:
|ID --------------- | Organism ---------------- | Category
|1 ---------------- | E. coli ----------------- | representative
|2 ---------------- | E. coli ----------------- | reference
|3 ---------------- | E. coli ----------------- | na
|4 ---------------- | B.subtitle -------------- | representative
|5 ---------------- | B.subtitle -------------- | na
因此,在这个例子中,我需要从每个物种中选择 1 个(存在另一列使用整数表示 Organism 比文本类型的列更好用),选择的条件是:
- 选择AWAYS类别:引用优先
- 如果没有引用,选择代表
- 如果不存在引用和代表,请从任何类别中选择
查询结果将是:
|ID --------------- | Organism ---------------- | Category
|2 ---------------- | E. coli ----------------- | reference
|4 ---------------- | B.subtitle -------------- | representative
最佳答案
您正在寻找 distinct on
:
select distinct on (organism) t.*
from t
order by organism, ( category = 'reference') desc;
这是如何运作的? Distinct on
是一个 Postgres 扩展。对于括号中键的每个唯一组合,它只返回一行。哪一排?第一行由 order by
定义。
( category = 'reference' ) desc
逻辑只是将每个有机体的引用类别(如果有的话)放在第一位。
关于sql - SELECT 有优惠条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48732355/