如何查询每个客户对应最大行号的行数据
解决方法
你当前的查询逻辑已经接近需求,仅需要在外层增加行号筛选逻辑即可,常用实现方案有两种:
方案1:调整窗口排序规则直接取首条
将窗口函数的排序规则改为日期倒序,此时每个客户分组下最新的记录行号为1,直接筛选行号等于1的记录即可:
SELECT name, `order id`, date FROM ( SELECT name, `order id`, date, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) AS rn FROM `table` ) t WHERE rn = 1;
方案2:保留原升序逻辑,匹配每组最大行号
如果需要保留你原有按日期升序编号的逻辑,可以先计算每个客户对应的最大行号,再关联匹配得到对应记录:
WITH base_data AS ( SELECT name, `order id`, date, ROW_NUMBER () OVER (PARTITION BY name ORDER BY date) AS rn FROM `table` ), group_max_rn AS ( SELECT name, MAX(rn) AS max_rn FROM base_data GROUP BY name ) SELECT b.name, b.`order id`, b.date FROM base_data b INNER JOIN group_max_rn g ON b.name = g.name AND b.rn = g.max_rn;
注意事项
- 你原查询中窗口函数的分区规则是
PARTITION BY name,order id,即按「客户+订单ID」分组排序,如果你实际需要的是这个维度下每组的最大行号记录,只需把上面SQL中PARTITION BY后的参数替换为name,order id``即可 - 带空格的字段名、和SQL保留字重名的表名/字段名(如本例中的
order id、table)需要用反引号包裹,避免执行时报语法错误
内容的提问来源于stack exchange,提问作者user14263992
相关产品推荐
相关产品推荐

