T-SQL - 为每个组转出不同的 N 行
Posted
技术标签:
【中文标题】T-SQL - 为每个组转出不同的 N 行【英文标题】:T-SQL - Pivot out Distinct N rows for each group 【发布时间】:2021-01-23 01:16:20 【问题描述】:我有一张类似于下表的表格,其中包含客户、产品和购买日期。我正在尝试获取客户列表及其 3 最近购买的 DISTINCT 产品。我想使用购买日期作为订购结果的一种方式,但我不想看到重复的产品 ID。
Customer | Product | PurchaseDate |
---|---|---|
1 | a | 2020-12-5 |
2 | b | 2020-12-5 |
1 | a | 2020-12-4 |
2 | a | 2020-12-3 |
1 | b | 2020-12-2 |
2 | b | 2020-12-1 |
1 | c | 2020-11-30 |
1 | d | 2020-11-29 |
2 | b | 2020-11-28 |
理想情况下我会看到这样的结果
Customer | Product1 | Product2 | Product3 |
---|---|---|---|
1 | a | b | c |
2 | b | a |
我尝试过按语句分区和按语句排序,但一切都希望我在最终输出中包含日期。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:最近的不同产品很棘手。这需要对每个客户和产品进行一级聚合,然后再进行一级聚合:
select customer,
max(case when seqnum = 1 then product end) as product_1,
max(case when seqnum = 2 then product end) as product_2,
max(case when seqnum = 3 then product end) as product_3
from (select customer, product, max(purchasedate) as max_purchasedate,
row_number() over (partition by customer order by max(purchasedate) desc) as seqnum
from t
group by customer, product
) cp
group by customer;
【讨论】:
非常感谢!这就像一个魅力,将节省我们很多时间。以上是关于T-SQL - 为每个组转出不同的 N 行的主要内容,如果未能解决你的问题,请参考以下文章
如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙