次に、OLAP 関数を使用したより一般的な例を示します。これにより、名前ごとに電話の種類と電話番号の最初の 4 つのペアが取得されます。誰かが 4 つ未満の場合、残りは NULL で埋められます。これを 4 つ以上に拡張する方法は明らかです。
select * from (
select id,
min(id) over (partition by name) as first_id,
name,
phone_type as phone_type1,
phone_no as phone_no1,
lead(phone_type,1) over (partition by name order by id) as phone_type2,
lead(phone_no,1) over (partition by name order by id) as phone_type2,
lead(phone_type,2) over (partition by name order by id) as phone_type3,
lead(phone_no,2) over (partition by name order by id) as phone_type3,
lead(phone_type,3) over (partition by name order by id) as phone_type4,
lead(phone_no,3) over (partition by name order by id) as phone_type4
from table
) where id = first_id
外側の選択により、1 人あたり 1 行のみが取得されることが保証されます。これが必要なのは、OLAP 関数 (この場合はmin(id)
) の結果を直接 where 句に入れることができないためです。