Это должно работать, но выглядит не очень красиво ...
SELECT DISTINCT ON(CUSTOMER_ID) ID FROM PURCHASES P
WHERE (CUSTOMER_ID,YEAR) =
(SELECT CUSTOMER_ID,MAX(YEAR) FROM PURCHASES WHERE CUSTOMER_ID = P.CUSTOMER_ID
GROUP BY CUSTOMER_ID);
Так что для ввода
ID | CUSTOMER_ID | YEAR
1 1 2011
2 2 2012
3 2 2012
4 1 2013
5 3 2014
6 3 2014
7 3 2015
Возвращается
id
4
2
7
Meaning:
For the lowest CUSTOMER_ID (it is 1) the id is 4 (year 2013)
Next we have CUSTOMER_ID (it is 2) the id is 2 (year 2012)
Lastly the CUSTOMER_ID (it is 3) the id is 7 (year 2015)
Идея, лежащая в основе этого:
Группировка по CUSTOMER_ID
Для каждой группы выберите max (год)
При циклическом просмотре всех записей - если Customer_id и year равны цифрам из номера 2., затем выберите ID из этой записи.
- Без DISTINCT ON (CUSTOMER_ID) будет возвращено 2 записи для CUSTOMER_ID = 2, потому что за оба года 2012 он будет находить некоторые записи во время цикла.
Если вы напишите в начале вместо:
SELECT DISTINCT ON(CUSTOMER_ID) ID FROM PURCHASES P
этот код:
SELECT DISTINCT ON(CUSTOMER_ID) * FROM PURCHASES P
тогда вы все ясно увидите.