SQL DB2显示名称字段发生更改的数据行

dgtucam1  于 2023-10-18  发布在  DB2
关注(0)|答案(1)|浏览(203)

我有一个包含多个字段的数据集,但我关心的主要3个字段是客户端,名称和日期。我需要选择名称更改的行。我试图使用分区,但它不为我工作。
Client_Info表

Client  Name    Date
1   John    12-jun-2023
1   John    13-jun-2023
1   Mick    14-jun-2023
1   Mick    15-jun-2023
1   Paddy   16-jun-2023
2   Mary    12-jun-2023
2   Mary    13-jun-2023
2   Mary    14-jun-2023
2   Paula   15-jun-2023
2   Rita    16-jun-2023

SQL尝试

Select * from client_Info CI1
Inner join (select row_number() over (partition by client order by date desc) rn,
client,name,date 
from Client_Info) CI2
on (CI2.client = CI1.client and
CI2.Date < CI1.Date and 
CI2.Name <> CI1.Name)
Where rn = 1
Order by CI1.Date;

结果应为:

Client  Name    Date
1   John    12-jun-2023
1   Mick    14-jun-2023
1   Paddy   16-jun-2023
2   Mary    12-jun-2023
2   Paula   15-jun-2023
2   Rita    16-jun-2023
3ks5zfa0

3ks5zfa01#

使用lag olap函数。

with client_info (Client, Name, Date) as
(
values
  (1, 'John ', '12-jun-2023')
, (1, 'John ', '13-jun-2023')
, (1, 'Mick ', '14-jun-2023')
, (1, 'Mick ', '15-jun-2023')
, (1, 'Paddy', '16-jun-2023')
, (2, 'Mary ', '12-jun-2023')
, (2, 'Mary ', '13-jun-2023')
, (2, 'Mary ', '14-jun-2023')
, (2, 'Paula', '15-jun-2023')
, (2, 'Rita ', '16-jun-2023')
)
select Client, Name, Date
from
(
select 
  *
, coalesce (lag (Name) over (partition by Client order by Date), '')
  as Name_prev
from client_info
)
where Name <> Name_prev

| 客户端|名称|日期|
| --|--|--|
| 1 |约翰|2023年6月12日|
| 1 |米克|2023年6月14日|
| 1 |水稻|2023年6月16日|
| 2 |玛丽|2023年6月12日|
| 2 |Paula| 2023年6月15日|
| 2 |丽塔|2023年6月16日|
fiddle

相关问题