Postgresql DISTINCT ON的示例,基于多列上的条件选择GROUP BY集的一行

cyvaqqii  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(144)

我想分享一个非常有用的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 |

huwehgph

huwehgph1#

通过使用DISTINCT ON,您可以在每组mukey中检索具有最高comppct_r的cokey。试试这个代码。此查询将为每个mukey选择majcompflag = Yes的行中comppct_r值最高的行。如果对于特定mukey没有majcompflag = Yes的行,则将选择majcompflag = No的行中具有最大comppct_r的行。如果多行包含相同的comppct_r值,DISTINCT ON将随机选取一行。

SELECT DISTINCT ON (mukey) mukey, cokey, majcompflag, comppct_r
FROM component
WHERE majcompflag = 'Yes' OR (
  majcompflag = 'No' AND comppct_r = (
    SELECT MAX(comppct_r) FROM component c
    WHERE c.mukey = component.mukey AND majcompflag = 'No'
  )
)
ORDER BY mukey, majcompflag DESC, comppct_r DESC;

希望它能起作用:)

相关问题