Sql cod 消除客户重复项

问题描述 投票:0回答:2

我有一个客户表,有重复的记录,最新的不一定有完整的信息 例如

顾客 创建于 姓氏 城市 地址
A 2022 年 1 月 2 日 亚当斯 美国 第34街
A 2023年7月18日 M。亚当斯 纽约 美国

我有类似上表的东西。 我的目标是通过获取最新的记录信息来消除重复,如果它为空,则带来最后一条记录。

我想要得到这样的东西

顾客 创建于 姓氏 城市 地址
A 2023年7月18日 M。亚当斯 纽约 美国 第34街

任何人都可以帮助编写此 SQL 代码来实现我的最终目标。

请注意,客户 ID 是唯一的,因为业务人员不断添加新客户,而不是编辑现有的旧记录...

当我尝试使用

ifnull()
MAX()
但结果并不像我期望的那样

sql mysql google-bigquery data-warehouse
2个回答
0
投票

您可以使用

first_value
窗口函数忽略空值并用所有非空值填充最新记录(如果当前值为空则为前一个值),最后删除所有以前的记录,如下所示:

select customer, created_at, last_name, 
       ..... 
  FROM
  (select customer, created_at, 
          row_number() over w as rn,
          min(last_name ignore nulls) over w as last_name,
          ...
     from your_table t
     WINDOW w AS (PARTITION BY customer ORDER BY created_at DESC)
) where rn = 1

0
投票

您可以为此使用窗口函数(例如first_value):

with cte as (
    select customer
         , created_at
         , row_number() over (partition by customer order by created_at desc) as rn
         , first_value(last_name ignore nulls) over w as last_name1
         , first_value(city ignore nulls) over w as city1
         , first_value(county ignore nulls) over w as county1
         , first_value(adress ignore nulls) over w as adress1
    from t
    window w as (
        partition by customer 
        order by created_at desc
        rows between unbounded preceding and unbounded following
    )
)
select *
from cte
where rn = 1
© www.soinside.com 2019 - 2024. All rights reserved.