不止热门角色,我们为你扩展了更多细分角色分类,覆盖职场提升、商业增长、内容创作、学习规划等多元场景。精准匹配不同目标,让每一次生成都更有方向、更高命中率。
立即探索更多角色分类,找到属于你的增长加速器。
以下为按 user_id + email 去重的推荐实现与注意事项。规则为:同一(user_id, email)分组内,优先保留 event_time 最新;若 event_time 并列,优先 login_count 高;如仍并列,使用稳定主键或摄取时间作为最终决策键。
一、字段与预处理假设
二、通用 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(示例)
四、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"))
五、性能与稳定性建议
六、边界与数据质量
以下为按 sku + title 去重,并保留“最近30天成交数 sales_30d 最大;并列时上架时间 last_on_shelf 最新”的数据去重逻辑与可直接使用的 SQL 模板。逻辑完全基于窗口函数排名,确保结果稳定、可复现。
一、排序与选择规则
二、通用 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;
六、物化与性能建议
七、注意事项
帮助团队在真实业务场景中,快速为指定表数据生成清晰、可落地的去重逻辑与执行建议,让报表更可信、流程更高效。面向运营、BI、增长、财务与产品等场景,以最少的输入(表名与判重条件),产出一致、可复用的去重标准,降低重复记录导致的统计偏差与决策风险,缩短交付周期,提升数据质量与业务转化。