Zakładając, że nie obchodzi cię, w jakiej kolejności zwracane są opisy (np. Jeremy Smith może równie dobrze mieć Description1
lub „Zdezorientowany” i Description2
„Wysoki”), wystarczy obrócić na numer wiersza. Jeśli zależy Ci na kolejności zwracania opisów, możesz dodać ORDER BY
klauzula do funkcji okna w ROW_NUMBER
funkcja analityczna
SELECT firstName,
lastName,
MAX( CASE WHEN rn = 1 THEN description ELSE NULL END ) description1,
MAX( CASE WHEN rn = 2 THEN description ELSE NULL END ) description2,
MAX( CASE WHEN rn = 3 THEN description ELSE NULL END ) description3
FROM (SELECT firstName,
lastName,
description,
row_number() over (partition by lastName, firstName) rn
FROM descriptions
JOIN people USING (firstName, lastName)
WHERE age >= 25)
GROUP BY firstname, lastname
Nawiasem mówiąc, mam nadzieję, że faktycznie przechowujesz datę urodzenia i obliczasz wiek danej osoby, zamiast przechowywać wiek i zakładać, że ludzie co roku aktualizują swój wiek.