sql >> Databáze >  >> RDS >> Sqlserver

group_concat v SQL Server 2012 s ORDER BY dalším sloupcem

Nejsem si jistý, jestli to bude rychlejší, ale tady je alternativní verze, kde se nepřipojujete k purchases dvakrát v 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;

Viz SQL Fiddle s ukázkou

Výsledek:

| 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 |



  1. počítat bez skupiny

  2. Jak vložit výsledek FOR AUTO XML do tabulky?

  3. Migrace MySQL na PostgreSQL na AWS RDS, část 3

  4. Nedostatek systémové paměti ve fondu prostředků ke spouštění skriptů SQL na serveru SQL Server 2008