我有以下数据:
| 识别码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
有更快的路吗?
先谢了!
2条答案
按热度按时间mpgws1up1#
你可以用一个窗口函数而不是一个连接来编写这个函数:
至于哪种方法更快,试试看吧。如果你需要解释结果的帮助,展示每种方法的解释(分析,缓冲)。你应该根据你理解它们的容易程度来选择它们,而不是速度。有些人凭直觉掌握窗口功能,有些人则没有。
wpcxdonn2#
再次阅读问题后,我将把它编辑为alt方法来完成,这取决于数据库如何运行它的操作,可能会稍微快一些或慢一些。
可能会更快地返回结果编辑日志:固定排印错误