Хотя вы можете рассматривать это как проблему пробелов и островков, вы можете просто посмотреть на последний продукт и получить все последние строки, которые соответствуют.
select p.*
from (select p.*,
count(*) filter (where productid <> last_productid) over (partition by empid order by purchasedate) as num_otherproducts
from (select p.*,
first_value(productid) over (partition by empid order by purchasedate desc) as last_productid
from purchase p
) p
) p
where num_otherproducts = 0;
Если вы использовали пробел и Подход к островам, я бы рекомендовал сделать это следующим образом:
SELECT p.*
FROM (SELECT p.*,
ROW_NUMBER() OVER ( PARTITION BY empid ORDER BY purchasedate desc ) as seqnum1,
ROW_NUMBER() OVER ( PARTITION BY empid, productid ORDER BY purchasedate desc ) as seqnum2
FROM purchase p
) p
WHERE seqnum1 = seqnum2
ORDER BY p.purchasedate;
Идея состоит в том, чтобы перечислять строки для каждого empid
с конца. И перечислить строки для каждой комбинации empid
/ productid
. Когда они одинаковы, у вас есть конечный продукт.