我有一个客户表,有重复的记录,最新的不一定有完整的信息 例如
顾客 | 创建于 | 姓氏 | 城市 | 县 | 地址 |
---|---|---|---|---|---|
A | 2022 年 1 月 2 日 | 亚当斯 | 空 | 美国 | 第34街 |
A | 2023年7月18日 | M。亚当斯 | 纽约 | 美国 | 空 |
我有类似上表的东西。 我的目标是通过获取最新的记录信息来消除重复,如果它为空,则带来最后一条记录。
我想要得到这样的东西
顾客 | 创建于 | 姓氏 | 城市 | 县 | 地址 |
---|---|---|---|---|---|
A | 2023年7月18日 | M。亚当斯 | 纽约 | 美国 | 第34街 |
任何人都可以帮助编写此 SQL 代码来实现我的最终目标。
请注意,客户 ID 是唯一的,因为业务人员不断添加新客户,而不是编辑现有的旧记录...
当我尝试使用
ifnull()
和MAX()
但结果并不像我期望的那样
您可以使用
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
您可以为此使用窗口函数(例如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