我有一个查询,该查询实际上试图获取每个不同的other_field
的最大序列值(下面的简化示例)。
您需要了解一些字段
ID text
ser serial
other_field text
对于每个不同的other_field
,我想找到具有最大序列值的整行
我基本上想返回整行,但最终不得不在同一个表上连接以检索我想要的内容(因为group by子句通常具有严格的限制)。我在下面使用的查询
SELECT small_q.id FROM (
SELECT id, MAX(ser) as serial FROM table_name GROUP BY other_field
) max_q JOIN table_name full_t ON small_q.serial = max_q.serial
有什么办法可以避免不必加入同一张桌子?
非常感谢
答案 0 :(得分:2)
简单的答案是使用开窗功能:
SELECT main.* FROM (
SELECT *, MAX(ser) over (partition by other_field) as serial FROM table_name
) main where main.ser=main.serial
答案 1 :(得分:0)
如果每个other_field
仅查找一行,我强烈建议在Postgres中使用distinct on
:
SELECT DISTINCT ON (other_field) t.id
FROM table_name t
ORDER BY other_field, ser DESC ;
在Postgres中,DISTINCT ON
通常具有比完成同一件事的其他方式更好的性能特征。