Presto窗口函数实现各分区内name与username去重查询
Presto 去重查询调整方案
根因说明
你当前的窗口函数仅以name作为分区维度排序生成序号,没有对同一分区内重复出现的username做去重处理,导致同一用户会在同一个name分组下被多次计数,无法满足「name与username组合完全唯一」的要求。
具体调整逻辑
需要通过两层窗口函数实现目标:
- 第一层去重:以
name + username作为组合分区,按datetime升序排序,仅保留每个组合下最早出现的1条记录,彻底过滤掉同一分组下重复出现的用户行。 - 第二层重排序:对已经完成去重的数据集,重新按
name分区、datetime升序生成连续的top_user序号,最后保留每个分组下序号小于6的行,匹配你原本取每组前5个用户的需求。
可直接运行的调整后SQL
SELECT * FROM ( -- 第二层:对去重后的数据集重新生成连续的top_user序号 SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY datetime ASC) AS top_user FROM ( -- 第一层:对name+username组合做内部分区,标记重复行 SELECT name, username, datetime, message, Count, Date, Price, Percent, Volume, ROW_NUMBER() OVER (PARTITION BY name, username ORDER BY datetime ASC) AS user_rn FROM table_name ) dedup_base WHERE user_rn = 1 -- 剔除同一name分组下重复的username行 ) ranked_result WHERE top_user < 6 ORDER BY name, top_user
效果匹配说明
- 重复行过滤效果:原输出中ENZC分组下重复的
OtcRock、LTNC分组下重复的OneTickMoline、OZSC分组下重复的JZavitka/S_AnglinIV、SANP分组下重复的Fluffypillows9,都会被第一层过滤逻辑剔除,每个分组内不存在name、username完全相同的重复行。 - 序号匹配效果:第二层生成的
top_user为连续无跳号的正整数,和你提供的期望输出中的序号规则完全一致。
内容的提问来源于stack exchange,提问作者A l w a y s S u n n y
相关产品推荐
相关产品推荐

