SELECT Id, ForeignKey, Datetime, Text FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY ForeignKey ORDER BY DateTime DESC) as rn,
*
FROM table
WHERE
rn = 1
);
Виктор П., В теории можно через группировку решить, но это медленно достаточно.
Оконные функции не очень сложные - тут например нумеруются строки в группках с одинаковым ForeignKey, при этом строки в группах сортируются по DateTime по убыванию.
Потом отбираем только те строки, где ROW_NUMBER = 1.
Василий Банников, своими кастыльными мозгами я бы создал таблицу, залил бы в неё данные с помощью группировки или подзапросов. Потом бы удалил всё из основной таблицы, кроме тех, которые присутствуют во временной таблице. Но прям "не изящно"... )
По итогу я вообще грохнул все данные и поставил заливку ещё раз этой таблицы заново с нормальными правилами. Но в вашей теме надо бы подразобраться, прям какой-то новый уровень.
Спасибо