gpt4 book ai didi

sql-order-by - SQL Server 2012 中的 group_concat 与 ORDER BY 另一列

转载 作者:行者123 更新时间:2023-12-05 01:17:49 26 4
gpt4 key购买 nike

我有一个包含 ~ 一百万个这样的条目的表:

customer_id | purchased_at     | product
1 | 2012-06-01 00:00 | apples
1 | 2012-09-02 00:00 | apples
1 | 2012-10-01 00:00 | pears
2 | 2012-06-01 00:00 | apples
2 | 2012-07-01 00:00 | apples
3 | 2012-09-02 00:00 | pears
3 | 2012-10-01 00:00 | apples
3 | 2012-10-01 01:00 | bananas

我想将产品连接到一行,DISTINCT 并按购买的_at 的顺序

在 MySQL 中,我只使用
select customer_id, min(purchased_at) as first_purchased_at, 
group_concat(DISTINCT product order by purchased_at) as all_purchased_products
from purchases group by customer_id;

要得到
customer_id | first_purchased_at | all_purchased_products
1 | 2012-06-01 00:00 | apples, pears
2 | 2012-06-01 00:00 | apples
3 | 2012-09-02 00:00 | pears, apples, bananas

我如何在 SQL Server 2012 中做到这一点?

我尝试了以下“hack”,它有效,但它是一种矫枉过正,在长 table 上表现不佳
select
customer_id,
min(purchased_at) as first_purchased_at,
stuff ( ( select ',' + p3.product
from (select p2.product, p2.purchased_at,
row_number() over(partition by p2.product order by p2.purchased_at) as seq
from purchases p2 where
p2.customer_id = p1.customer_id ) p3
where p3.seq = 1 order by p3.purchased_at
for XML PATH('') ), 1,1,'') AS all_purchased_products
from purchases p1
group by customer_id;

我能做些什么来解决这个问题?

最佳答案

我不确定这是否会更快,但这里有一个替代版本,您不会在 purchases 中两次加入 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;

SQL Fiddle with Demo

结果:
| 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 |

关于sql-order-by - SQL Server 2012 中的 group_concat 与 ORDER BY 另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com