我有一个问题,我在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);
答案 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
逻辑只是为每个生物体首先放置参考类别(如果有的话)。