Пример данных:
declare @T1 table
(
ClaimID int,
Person varchar(20),
TransactionDate date,
Status varchar(20)
)
insert into @T1
values (1, 'Person1', '2018-03-05','Open')
,(1, 'Person2', '2018-03-10','Open')
,(1, 'Person2', '2018-03-15','Closed')
,(2, 'Person3', '2018-03-15','Open')
,(2, 'Person3', '2018-03-23','Closed')
,(3, 'Person4', '2018-04-18','Closed')
,(4, 'Person5', '2018-04-23','Open')
,(4, 'Person5', '2018-04-25','Open')
select *
from @T1 t2
where TransactionDate <= '2018-12-31'
order by ClaimID, TransactionDate
Вывод будет выглядеть следующим образом:
Мне нужно создать столбец логических значений is_Open
. Например, Person2
в последнем TransactionDate
имел Status "Closed"
, поэтому значение для этой строки и всех предыдущих строк для Person2
должно быть 0.
То же самое для Person3 - его был закрыт на 2018-03-23
, поэтому все предыдущие значения для Person3 должны быть 0.
Но Person5
имеет Status
"Open" в последнюю TransactionDate, поэтому значение для этой (последнейactionDate) должно быть 1 но для предыдущего TransactionDate должно быть 0, даже если status
равно Open
Для столбца is_Open:
Если последний TransactionDate
для Person
имеет Status
Open
, затем 1, все предыдущие транзакции 0. Если последняя транзакция имеет статус Закрыто, то 0 и все предыдущие транзакции 0.
Для столбца is_Closed:
Если последние TransactionDate
для Person
имеют Status
Closed
, то 1, все предыдущие транзакции 0.Если последние TransactionDate
для Person
имеют Status
Open
, то 0 и все предыдущие транзакции 0.
Результат должен выглядеть следующим образом:
Я пытался использовать ROW_NUMBER()
и LAST_VALUE
функции, но до сих пор не могу понять:
select
*,
row_number() over (partition by ClaimID order by TransactionDate) as rowNum,
iif(last_value(Status) over (partition by Person order by TransactionDate desc) = 'Closed', 1, 0) as LastValue
from
@T1 t2
where
TransactionDate <= '2018-12-31'
order by
ClaimID, TransactionDate