sql - SELECT 有优惠条件

标签 sql postgresql

我有一个问题,我在 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/

相关文章:

mysql - 获取每次访问的平均时间

java - 如何在postgres数据库中存储像RFID标签数据这样的长数据?

Postgresql 日志到远程logstash 服务器

mysql - 计算多个平均值中的最大值 - SQL

sql - 为什么 Timeout.timeout(sec) 不适用于 activerecord

mysql - SQL 语法错误 - 创建新数据库

sql - 如何获取 PostgreSQL 中每个用户的最后编辑帖子?

database - postgreSQL 选择未在聚合函数中使用的其他列

node.js - 使用 pg-promise 的连接池

sql - 在组内进行比较以获取共同值(value)