Не съм сигурен дали това ще бъде по-бързо, но ето алтернативна версия, в която не се присъединявате към покупки
два пъти в STUFF()
:
изберете customer_id, min(purchased_at) като first_purchased_at, неща ((изберете ',' + p2.product from ( select product, customer_id, ROW_NUMBER() over(partition by customer_id, product order by purchased_at) rn, ROW_NUMBER() over(разделяне по customer_id поръчка по purchased_at) rnk от покупки ) p2 където p2.customer_id =p1.customer_id и p2.rn =1 група по p2.product, rn, rnk поръчка по rnk за XML PATH('') ), 1,1,'') AS all_purchased_products от p1group покупки от customer_id;
Вижте SQL Fiddle с демонстрация
Резултат:
<предварителен код>| КЛИЕНТ_ID | FIRST_PURCHASED_AT | ВСИЧКИ_ЗАКУПЕНИ_ПРОДУКТИ |------------------------------------------------ ----------------------------| 1 | 01 юни 2012 г. 00:00:00+0000 | ябълки, круши || 2 | 01 юни 2012 г. 00:00:00+0000 | ябълки || 3 | 02 септември 2012 г. 00:00:00+0000 | круши, ябълки, банани |