No estoy seguro de si esto será más rápido, pero aquí hay una versión alternativa en la que no te unes a purchases
dos veces en STUFF()
:
select customer_id,
min(purchased_at) as first_purchased_at,
stuff ((select ',' + p2.product
from
(
select product, customer_id,
ROW_NUMBER() over(partition by customer_id, product order by purchased_at) rn,
ROW_NUMBER() over(partition by customer_id order by purchased_at) rnk
from purchases
) p2
where p2.customer_id = p1.customer_id
and p2.rn = 1
group by p2.product, rn, rnk
order by rnk
for XML PATH('') ), 1,1,'') AS all_purchased_products
from purchases p1
group by customer_id;
Consulte SQL Fiddle con demostración
Resultado:
| CUSTOMER_ID | FIRST_PURCHASED_AT | ALL_PURCHASED_PRODUCTS |
---------------------------------------------------------------------------
| 1 | June, 01 2012 00:00:00+0000 | apples,pears |
| 2 | June, 01 2012 00:00:00+0000 | apples |
| 3 | September, 02 2012 00:00:00+0000 | pears,apples,bananas |