Как заменить 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;
Другие вопросы по тегам