Как заменить DISTINCT ON на GROUP BY в PostgreSQL 9?
Я использовал предикат DISTINCT ON и решил заменить его на GROUP BY, главным образом потому, что он "не является частью стандарта SQL и иногда считается плохим стилем из-за потенциально неопределенного характера его результатов".
Я использую DISTINCT ON в сочетании с ORDER BY, чтобы выбрать последние записи в таблице истории, но мне не ясно, как сделать то же самое с GROUP BY. Каким может быть общий подход для перехода от одной конструкции к другой?
Примером может быть
SELECT
DISTINCT ON (f1, f2 ) *
FROM table
ORDER BY f1, f2, datefield DESC;
где я получаю "последние" пары (f1,f2).
1 ответ
Если у вас есть такой запрос:
select distinct on (col1) t.*
from table t
order by col1, col2
Тогда вы бы заменить это оконными функциями, а не group by
:
select t.*
from (select t.*,
row_number() over (partition by col1 order by col2) as seqnum
from table t
) t
where seqnum = 1;