我有一个连接我的客户和交易表的查询,让这个连接的查询别名为 jq 。我想按订单时间戳 ( order_ts ) 创建每个客户购买(交易)的排名。所以我做了,

SELECT customer_id,
       order_id,
       order_ts,
       RANK() OVER (PARTITION BY customer_id ORDER BY order_ts ASC),
       amount
FROM jq GROUP BY customer_id
        ORDER BY customer_id;

现在,我希望从第 5 次购买开始成为一个聚合的单行,而不是第 5、6、7 次等等。求和的行将保留第 5 个的 order_idorder_ts 。如何在 MS SQL Server 和 Postgres 中执行此操作?

最佳答案

如果我理解正确,您可以使用 CASE EXPRESSION 实现这一点:

SELECT customer_id,min(order_id),min(order_ts), CASE WHEN rnk < 5 then rnk else 5 end as rnk,sum(amount)
FROM(
    SELECT customer_id,
           order_id,
           order_ts,
           RANK() OVER (PARTITION BY customer_id ORDER BY order_ts ASC) as rnk,
           amount
    FROM jq)
GROUP BY customer_id,
         CASE WHEN rnk < 5 then rnk else 5 end
ORDER BY customer_id

这会将每个 rnk > 5 分组为 5,因此分组为 1 组。我选择了 min order_id,ts 从第 5 个中选择它。

关于sql - 聚合排名或索引 >= N 的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36303396/

10-14 18:53
查看更多