PostgreSQL DISTINCT ON示例:基于多列条件选取分组中的一行
实用PostgreSQL命令示例:DISTINCT ON
我想分享一个非常实用的PostgreSQL命令示例:DISTINCT ON。
我的数据来自USDA SSURGO土壤数据集,需求很明确:针对每个mukey,优先选取majcompflag为Yes且comppct_r值最高的cokey;如果没有majcompflag为Yes的记录,就选comppct_r值最大的cokey;要是符合条件的cokey不唯一,随便选一个就行。下面是一小段数据示例:
一开始我写了一堆复杂的子查询,结果还是覆盖不全所有情况,直到发现了简单高效的DISTINCT ON命令。
DISTINCT ON会按指定字段分组,对每组内的条目按排序条件排列,然后直接取第一条。用它来实现我的需求,查询语句可以简化成这样:
SELECT DISTINCT ON (mukey) mukey,cokey,majcompflag,comppct_r FROM component ORDER BY mukey,majcompflag DESC,comppct_r DESC
| mukey | cokey | majcompflag | comppct_r |
|---|---|---|---|
| 1020315 | 23068517 | No | 10 |
| 1020315 | 23068518 | No | 10 |
| 1020315 | 23068519 | No | 5 |
| 1020315 | 23068520 | Yes | 70 |
| 1020315 | 23068521 | No | 2 |
| 1020315 | 23068522 | No | 3 |
| 1020316 | 23068807 | No | 3 |
| 1020316 | 23068808 | No | 5 |
| 1020316 | 23068809 | No | 2 |
| 1020316 | 23068810 | No | 6 |
| 1020316 | 23068811 | No | 3 |
| 1020316 | 23068812 | No | 6 |
| 1020316 | 23068813 | Yes | 75 |
内容的提问来源于stack exchange,提问作者brendan8229
相关产品推荐
相关产品推荐

