返回按查询分组的整行

时间:2019-10-02 14:59:32

标签: sql postgresql

我有一个查询,该查询实际上试图获取每个不同的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

有什么办法可以避免不必加入同一张桌子?

非常感谢

2 个答案:

答案 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通常具有比完成同一件事的其他方式更好的性能特征。