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:比较 2 个 XML 并返回具有不同值的节点

如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙

每个字符串每出现第 2 次,分别用文件的第 n 行替换两个不同的字符串

将 QUERY 结果的 GROUPS 组转置为单列

T-SQL“dense_rank”,每个等级的最大行数

如何从 T-SQL 中的表中选择前 N 行?