我有一个数据集如下,我想从中得出一些推论.
Id | Nbr | Dt | Status | Cont1Sta1 | DateLagInDays | Recurrence |
---|---|---|---|---|---|---|
1 | 2 | 2023-10-1 | 1 | |||
1 | 2 | 2023-11-2 | 0 | |||
1 | 2 | 2023-12-13 | 0 | |||
1 | 3 | 2023-10-1 | 0 | |||
1 | 3 | 2023-11-2 | 0 | |||
1 | 3 | 2023-12-13 | 1 | |||
1 | 9 | 2023-11-1 | 0 | |||
1 | 9 | 2023-12-1 | 1 | |||
1 | 9 | 2024-1-1 | 0 |
我已经创建了一个基于ID, number
的SQL Server数据分区,并按照dt
的升序排序.
所需的推论如下:
- 对于所选分区,是否存在任何状态= 1的实例.
- 如果#1为true,则是状态= 0的最早实例与该行的状态= 1之间的日期差.
- 在分区内,在至少有一行状态= 1后,是否有任何新行忽略状态值?
使用分区基本逻辑可以实现这一点吗?我确实try 在分区中使用滞后和前导,但它不会产生一个好的结果.
任何关于编写一个好的简洁代码的建议都是有帮助的.
虽然我try 了一些其他的东西,我有以下干净的代码,我目前正在使用.我希望在转换后的第一个实例行中,每个分区都填充Cont1Sta1、DateLagInDays、Recurrence列.
declare @t table
(
id int,
nbr int,
dt date,
status smallint,
Cont1Sta1 bit,--if the chosen partition has atleast one status=1
DateLagInDays int,--date diff in days from earliest record within partition to when status=1
Recurrence bit --does partition has atleast one new row after one possible row that has status=1
)
insert into @t(id,nbr,dt,status) select 1,9,'2023-11-1',0
insert into @t(id,nbr,dt,status) select 1,9,'2023-12-1',1
insert into @t(id,nbr,dt,status) select 1,9,'2024-1-1',0
insert into @t(id,nbr,dt,status) select 1,2,'2023-10-1',1
insert into @t(id,nbr,dt,status) select 1,2,'2023-11-2',0
insert into @t(id,nbr,dt,status) select 1,2,'2023-12-13',0
insert into @t(id,nbr,dt,status) select 1,3,'2023-10-1',0
insert into @t(id,nbr,dt,status) select 1,3,'2023-11-2',0
insert into @t(id,nbr,dt,status) select 1,3,'2023-12-13',1;
select
id, nbr, dt,status,
rank() over (partition by id, nbr, status order by id, nbr, dt asc, status desc) rownbr
from
@t
order by
id, nbr, dt asc, status desc;
以下是所需的表格结果:
Id | Nbr | Dt | Status | Cont1Sta1 | DateLagInDays | Recurrence |
---|---|---|---|---|---|---|
1 | 2 | 2023-10-1 | 0 | 1 | 32 | 1 |
1 | 2 | 2023-11-2 | 1 | 0 | 0 | 0 |
1 | 2 | 2023-12-13 | 0 | 0 | 0 | 0 |
1 | 3 | 2023-10-1 | 0 | 1 | 73 | 0 |
1 | 3 | 2023-11-2 | 0 | 0 | 0 | 0 |
1 | 3 | 2023-12-13 | 1 | 0 | 0 | 0 |
1 | 9 | 2023-11-1 | 1 | 1 | 0 | 1 |
1 | 9 | 2023-12-1 | 0 | 0 | 0 | 0 |
1 | 9 | 2024-1-1 | 0 | 0 | 0 | 0 |