我想分享一个非常有用的Postgres命令的例子:Distinct On。
我有以下格式的数据,来自美国农业部SSURGO土壤数据集。对于每个mukey,我想要在majcomplfag = Yes的所有值中具有最高comppct_r值的cokey,如果没有cokey具有majcomplfag = Yes,那么我想要具有最大comppct_r的cokey。如果这样的cokey不是唯一的,我将从最优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
| 穆基|焦炭|马赫科姆夫利格|压缩机|
| --|--|--|--|
| 1020315 | 23068517 |没有| 10 |
| 1020315 | 23068518 |没有| 10 |
| 1020315 | 23068519 |没有| 5 |
| 1020315 | 23068520 |是的| 70 |
| 1020315 | 23068521 |没有| 2 |
| 1020315 | 23068522 |没有| 3 |
| 1020316 | 23068807 |没有| 3 |
| 1020316 | 23068808 |没有| 5 |
| 1020316 | 23068809 |没有| 2 |
| 1020316 | 23068810 |没有| 6 |
| 1020316 | 23068811 |没有| 3 |
| 1020316 | 23068812 |没有| 6 |
| 1020316 | 23068813 |是的| 75 |
1条答案
按热度按时间huwehgph1#
通过使用DISTINCT ON,您可以在每组mukey中检索具有最高comppct_r的cokey。试试这个代码。此查询将为每个mukey选择majcompflag = Yes的行中comppct_r值最高的行。如果对于特定mukey没有majcompflag = Yes的行,则将选择majcompflag = No的行中具有最大comppct_r的行。如果多行包含相同的comppct_r值,DISTINCT ON将随机选取一行。
希望它能起作用:)