Postgres: отличительный, но только для одного столбца и последнего

У меня есть следующая оригинальная таблица

оригинальный стол

То, что я хочу, это получить последний history_id с отличным new_id. Следующим образом:

желаемый результат

Я обнаружил, что в нем есть несколько различных элементов, но он содержит только то, как получить один отдельный столбец. Пожалуйста, помогите мне.

3 ответа

Решение

Это будет работать, если ваша таблица называется x:

select * from x
where history_id in (
   select max(history_id) from x group by news_id
);

Выход:

 history_id | news_id |      news_headline       
------------+---------+--------------------
          1 |       5 | My test Headline
         13 |       7 | My test Headline
          3 |       4 | New Headline
          4 |       6 | History Headline

Это также работает (и проще):

select distinct on (news_id) *
from x
order by news_id, history_id desc;

(но это никогда не кажется мне "правильным")

Вместо того, чтобы использовать distinct on Вы можете использовать оконную функцию, которая обычно более гибкая, но немного медленнее, чем при использовании distinct on

select history_id, news_id, news_headline
from (
   select history_id, news_id, news_headline,
          row_number() over (partition by news_id order by history_id desc) as rn
   from the_table
) t
where rn = 1
order by history_id;

Попробуйте использовать это,

select max(history_id),news_id,newsheadline from 
table1 group by news_id,newsheadline
Другие вопросы по тегам