我怎样才能使PostgreSQL查询更快,以便返回最小值?

cvxl0en2  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(112)

我有以下数据:
| 识别码1|身份2|刻痕|
| - ------|- ------|- ------|
| 二百八十一|小行星33453|二十三|
| 二百八十一|小行星33452|二十三|
| 二百八十一|小行星36466|二十四|
| 二百八十二|小行星12118|十四|
| 二百八十二|小行星27603|十八|
我如何在PostgreSQL中以最有效的方式编写我的查询,以便保留所有属于得分最低的id 1的id 2值(对于每个id 1)?或者换句话说,我希望得到以下结果:
| 识别码1|身份2|最小评分|
| - ------|- ------|- ------|
| 二百八十一|小行星33453|二十三|
| 二百八十一|小行星33452|二十三|
| 二百八十二|小行星12118|十四|
到目前为止,我使用了以下查询:

‌‌SELECT m1.id1, m1.id2, m2.min_score 
FROM test m1
INNER JOIN (
      SELECT id1, MIN(score) as min_score
      FROM test
      GROUP BY id1
      ) m2
ON (m1.id1 = m2.id1 AND m1.score = m2.min_score) 
ORDER BY m1.id1, m2.min_score

有更快的路吗?
先谢了!

mpgws1up

mpgws1up1#

你可以用一个窗口函数而不是一个连接来编写这个函数:

select id1, id2, score as min_score from (
    select *, rank() over (partition by id1 order by score) as rank 
    from test
) foo 
where rank=1
ORDER BY id1, min_score;

至于哪种方法更快,试试看吧。如果你需要解释结果的帮助,展示每种方法的解释(分析,缓冲)。你应该根据你理解它们的容易程度来选择它们,而不是速度。有些人凭直觉掌握窗口功能,有些人则没有。

wpcxdonn

wpcxdonn2#

再次阅读问题后,我将把它编辑为alt方法来完成,这取决于数据库如何运行它的操作,可能会稍微快一些或慢一些。

SELECT distinct a.id1, a.id2, a.minscore
FROM test a,
(SELECT id1, min(score) as minscore
FROM test
group by id1
) AS b
WHERE a.id= b.id

可能会更快地返回结果编辑日志:固定排印错误

相关问题