Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

group_concat no SQL Server 2012 com ORDER BY outra coluna


Não tenho certeza se isso será mais rápido, mas aqui está uma versão alternativa em que você não participa de purchases duas vezes no 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 with Demo

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 |