选择优先条件

时间:2018-02-11 14:05:57

标签: sql postgresql

我有一个问题,我在PostgreSQL中有一个表,我需要做一个查询来检索一些数据。

问题是,我需要选择每个物种中只有1个生物,但每个基因组在同一物种下有不同的类别,如:

|ID --------------- | Organism ---------------- | Category   
|2 ---------------- | E. coli ----------------- | reference  
|4 ---------------- | B.subtitle -------------- | representative 

所以,在这个例子中,我需要选择每个物种中的1个(存在另一个使用整数表示有机体的列比使用文本类型列更好),选择的条件是:
  - 选择AWAYS类别:参考第一个   - 如果没有参考,请选择代表
  - 如果没有参考和代表从任何类别中选择

查询结果将是:

@PutMapping("/people/{id}")
public ResponseEntity<Person> updatePerson(@PathVariable String id, 
@Valid @RequestBody Person person) {
Optional<Person> personToUpdate = 
Optional.ofNullable(this.personRepository.findOne(id));
if(!personToUpdate.isPresent()) {
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
if(personToUpdate.get().getName() != null) {
    personToUpdate.get().setName(person.getName());

}
if(personToUpdate.get().getSurname() != null) {
    personToUpdate.get().setSurname(person.getSurname());

}
if(personToUpdate.get().getBirthDate() != null) {
    personToUpdate.get().setBirthDate(person.getBirthDate());
}
if(personToUpdate.get().getDateOfDeath() != null) {
    personToUpdate.get().setDateOfDeath(person.getDateOfDeath());
}
if(personToUpdate.get().getGraveId() != null) {
    personToUpdate.get().setGraveId(person.getGraveId());
}

Person updatedPerson = this.personRepository.insert(personToUpdate.get());

return new ResponseEntity<>(updatedPerson, HttpStatus.OK);

1 个答案:

答案 0 :(得分:2)

您正在寻找distinct on

select distinct on (organism) t.*
from t
order by organism, ( category = 'reference') desc;

这是如何工作的? Distinct on是Postgres扩展程序。它为括号中的每个唯一键组合返回一行。哪排? order by定义的第一行。

( category = 'reference' ) desc逻辑只是为每个生物体首先放置参考类别(如果有的话)。