×
¥
查看详情
🔥 会员专享 文生文 数据处理

数据去重逻辑设计

👁️ 396 次查看
📅 Sep 26, 2025
💡 核心价值: 提供基于指定条件的数据去重逻辑,适用于表数据处理。

🎯 可自定义参数(3个)

表格名称
输入表格的名称,例如:user_data。
去重条件
数据去重的条件,例如:基于email字段去重。
输出语言
输出的语言,例如:中文。

🎨 效果示例

以下为按 user_id + email 去重的推荐实现与注意事项。规则为:同一(user_id, email)分组内,优先保留 event_time 最新;若 event_time 并列,优先 login_count 高;如仍并列,使用稳定主键或摄取时间作为最终决策键。

一、字段与预处理假设

  • 必需字段:user_id, email, event_time(TIMESTAMP), login_count(INT)
  • 建议存在的稳定决策键:id(自增或唯一事件ID)或 ingest_time
  • 规范化建议:
    • 对 email 做标准化,示例:LOWER(TRIM(email)),避免大小写或空白差异造成重复未对齐
    • NULL 处理:
      • 将 event_time 为 NULL 视为最旧(排在最后)
      • 将 login_count 为 NULL 视为 0 或按业务定义;下例用 NULLS LAST 逻辑处理

二、通用 SQL 去重方案(窗口函数,推荐) 说明:使用窗口函数按(user_id, email_norm)分区,根据优先级排序并取 row_number=1。

标准写法(兼容性较好,无需 QUALIFY): WITH normalized AS ( SELECT user_id, LOWER(TRIM(email)) AS email_norm, event_time, login_count, id FROM user_events ), ranked AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY user_id, email_norm ORDER BY CASE WHEN event_time IS NULL THEN 1 ELSE 0 END, -- NULL 放最后 event_time DESC, CASE WHEN login_count IS NULL THEN 1 ELSE 0 END, -- NULL 放最后 login_count DESC, id DESC -- 最终稳定决策键(如无可去掉,但将非确定) ) AS rn FROM normalized ) SELECT user_id, email_norm AS email, event_time, login_count, id FROM ranked WHERE rn = 1;

Snowflake/BigQuery 等支持 QUALIFY 的写法: SELECT user_id, LOWER(TRIM(email)) AS email, event_time, login_count, id FROM user_events QUALIFY ROW_NUMBER() OVER ( PARTITION BY user_id, LOWER(TRIM(email)) ORDER BY event_time DESC NULLS LAST, login_count DESC NULLS LAST, id DESC ) = 1;

三、写回目标表的 MERGE(示例)

  • 场景:将去重结果落入 user_events_dedup。这里使用一个临时 CTE ranked 先筛出 rn=1,再 MERGE。 WITH normalized AS ( SELECT user_id, LOWER(TRIM(email)) AS email_norm, event_time, login_count, id FROM user_events ), ranked AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY user_id, email_norm ORDER BY CASE WHEN event_time IS NULL THEN 1 ELSE 0 END, event_time DESC, CASE WHEN login_count IS NULL THEN 1 ELSE 0 END, login_count DESC, id DESC ) AS rn FROM normalized ) MERGE INTO user_events_dedup t USING (SELECT * FROM ranked WHERE rn = 1) s ON (t.user_id = s.user_id AND t.email = s.email_norm) WHEN MATCHED THEN UPDATE SET event_time = s.event_time, login_count = s.login_count, id = s.id WHEN NOT MATCHED THEN INSERT (user_id, email, event_time, login_count, id) VALUES (s.user_id, s.email_norm, s.event_time, s.login_count, s.id);

四、Spark(DataFrame)实现 from pyspark.sql import functions as F, Window as W

dfn = (df .withColumn("email_norm", F.lower(F.trim(F.col("email")))))

w = (W.partitionBy("user_id", "email_norm") .orderBy(F.col("event_time").desc_nulls_last(), F.col("login_count").desc_nulls_last(), F.col("id").desc()))

df_dedup = (dfn .withColumn("rn", F.row_number().over(w)) .filter(F.col("rn") == 1) .drop("rn"))

五、性能与稳定性建议

  • 稳定决策键:如存在完全相同 event_time 与 login_count 的记录,务必使用稳定且单调的 id 或 ingest_time 做最终排序,保证结果确定性。
  • 索引/分区:
    • 事务型数据库:为(user_id, email_norm)建组合索引;如支持可在索引中加入 event_time DESC, login_count DESC 提升排序性能。
    • 数据仓库:对(user_id, email_norm)进行分桶/聚簇(如 BigQuery clustering, Snowflake clustering key)。
  • 预聚合优化(可选,大数据量时):先按(user_id, email_norm)求 max(event_time),筛出候选,再在候选中取 max(login_count),最后用稳定键打破并列,减少窗口数据量。

六、边界与数据质量

  • email 规范化策略需与业务确认(大小写、空白、别名等)。
  • 若 event_time 存在时区,统一到 UTC。
  • 明确 login_count 的 NULL 业务含义(若表示未知,可与 0 区分;上面示例将其排在非 NULL 之后)。
  • 无稳定键且多列完全并列时,结果不具有跨运行的确定性,需在源端或摄取层补充唯一键。

以下为按 sku + title 去重,并保留“最近30天成交数 sales_30d 最大;并列时上架时间 last_on_shelf 最新”的数据去重逻辑与可直接使用的 SQL 模板。逻辑完全基于窗口函数排名,确保结果稳定、可复现。

一、排序与选择规则

  • 分组键:sku, title
  • 排序优先级:
    1. sales_30d 降序(非空优先)
    2. last_on_shelf 降序(非空优先)
    3. 可选的最终稳定排序键(如 id 或 updated_at),用于打破所有字段完全相同的并列

二、通用 ANSI SQL(适用于大多数数据库) 说明:使用 ROW_NUMBER() + 子查询;使用 CASE WHEN 将 NULL 放到最后,避免 NULLS LAST 不同方言兼容性问题。

WITH ranked AS ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY t.sku, t.title ORDER BY CASE WHEN t.sales_30d IS NULL THEN 1 ELSE 0 END ASC, -- 非空优先 t.sales_30d DESC, CASE WHEN t.last_on_shelf IS NULL THEN 1 ELSE 0 END ASC, t.last_on_shelf DESC -- 可选:增加稳定排序键,避免完全并列的不确定性 -- , t.id ASC ) AS rn FROM product_items t ) SELECT * FROM ranked WHERE rn = 1;

三、PostgreSQL(使用 DISTINCT ON,性能与可读性更优) SELECT DISTINCT ON (t.sku, t.title) t.* FROM product_items t ORDER BY t.sku, t.title, t.sales_30d DESC NULLS LAST, t.last_on_shelf DESC NULLS LAST -- 可选稳定排序键 -- , t.id ASC ;

四、BigQuery / Snowflake(支持 QUALIFY,语句更简洁) BigQuery: SELECT t.* FROM product_items t QUALIFY ROW_NUMBER() OVER ( PARTITION BY t.sku, t.title ORDER BY IF(t.sales_30d IS NULL, 1, 0), t.sales_30d DESC, IF(t.last_on_shelf IS NULL, 1, 0), t.last_on_shelf DESC -- 可选稳定排序键 -- , t.id ) = 1;

Snowflake: SELECT t.* FROM product_items t QUALIFY ROW_NUMBER() OVER ( PARTITION BY t.sku, t.title ORDER BY IFF(t.sales_30d IS NULL, 1, 0), t.sales_30d DESC, IFF(t.last_on_shelf IS NULL, 1, 0), t.last_on_shelf DESC -- 可选稳定排序键 -- , t.id ) = 1;

五、Spark SQL(Databricks / Hive 方言) WITH ranked AS ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY t.sku, t.title ORDER BY CASE WHEN t.sales_30d IS NULL THEN 1 ELSE 0 END, t.sales_30d DESC, CASE WHEN t.last_on_shelf IS NULL THEN 1 ELSE 0 END, t.last_on_shelf DESC -- 可选稳定排序键 -- , t.id ) AS rn FROM product_items t ) SELECT * FROM ranked WHERE rn = 1;

六、物化与性能建议

  • 写回去重结果:
    • 覆盖写:CREATE TABLE product_items_dedup AS <上述查询>;
    • 或 MERGE INTO 目标表(以 sku, title 为匹配键)执行幂等更新。
  • 索引/分桶/聚簇:
    • OLTP(如 PostgreSQL/MySQL):建立复合索引 (sku, title)。
    • 数仓(如 BigQuery/Snowflake):CLUSTER BY/CLUSTERING KEY (sku, title) 以优化分组与扫描。

七、注意事项

  • 确认 sales_30d、last_on_shelf 的类型分别为数值与时间戳;若为字符串,请先做显式转换。
  • 若存在完全并列(sales_30d 与 last_on_shelf 都相同),建议在 ORDER BY 末尾加入稳定排序键(如 id 或 updated_at),确保结果确定性。
  • 若业务上需特殊处理 NULL(例如将 NULL 视为 0 或视为最旧时间),需相应调整 CASE WHEN 或使用 COALESCE。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

输入表名与去重条件,一键生成可落地的去重方案,包含规则、步骤与注意项。
自动识别关键字段与冲突场景,给出保留优先级与合并策略,减少人为判断成本。
内置空值、大小写、时间窗口等常见陷阱处理建议,降低误删风险,保障数据可信度。
按业务目标输出差异化策略,例如保留最新订单或最高评分记录,直连实际指标提升。
支持多语言说明文档输出,便于跨团队沟通与审核,减少来回确认与培训时间。
一键生成实施清单:字段筛选、唯一标识策略、冲突化解与回溯方案,确保上线有章可循。
可参数化复用,替换表名与条件即可套用,适配批量表处理与持续运营场景。
提供性能与资源权衡建议,兼顾准确率与处理速度,帮助你在高峰期稳定完成任务。
自动产出验证步骤与抽样检查方法,快速评估去重效果,减少回滚与二次返工。
生成结构化输出与清晰段落,方便复制到工单、SOP或评审材料,提升协作效率。

🎯 解决的问题

帮助团队在真实业务场景中,快速为指定表数据生成清晰、可落地的去重逻辑与执行建议,让报表更可信、流程更高效。面向运营、BI、增长、财务与产品等场景,以最少的输入(表名与判重条件),产出一致、可复用的去重标准,降低重复记录导致的统计偏差与决策风险,缩短交付周期,提升数据质量与业务转化。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...