我有一个连接我的客户和交易表的查询,让这个连接的查询别名为 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_id
和 order_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/