Так что в вашем посте есть какой-то запутанный язык.Вы говорите: «Повторите шаги 4, 5 и 6 для каждой строки с одинаковым значением MSISDN».это может означать, что каждая строка должна иметь CulcExpirationDate, но в вашем примере вы заполнили только одно.
Вы также выделили значения MSISDN, которые, как вы сказали, были идентичными, но вы включили как 248, так и 258.
Я пытался найти решение, основанное на вашей информации, используя фиктивную таблицу с ограниченным набором того, что вы указали на своем изображении.Вы можете видеть, что записи с самыми ранними значениями TransactionTime для MSISDN 248 и 258 были заполнены значением CulcExpirationDate, соответствующим следующему значению TransactionTime для соответствующего MSISDN.Все остальные значения равны NULL.
Проверьте здесь: https://rextester.com/IPQ11749
![Example results](https://i.stack.imgur.com/li2OU.png)
CREATE TABLE rowBasedTimeCalc
(
MSISDN INT
,TransactionTime DATETIME
,TransactionKey CHAR(50)
,Reference CHAR(50)
,NewExpirationDate DATETIME
)
INSERT INTO dbo.rowBasedTimeCalc
VALUES
(248, CONVERT(DATETIME,'28/10/2018 02:45:43',103), 'Bundle', 'DATA1GB',convert(DATETIME,'07/11/2018 02:45:43',103)),
(248, convert(DATETIME,'08/10/2018 07:58:23',103), 'Bundle', 'DATA1GB',convert(DATETIME,'28/10/2018 06:58:23',103)),
(258, convert(DATETIME,'08/10/2018 12:39:28',103), 'Bundle', 'DATA1GB',convert(DATETIME,'18/10/2018 12:39:28',103)),
(258, convert(DATETIME,'13/10/2018 06:05:44',103), 'Bundle', 'DATA1GB',convert(DATETIME,'23/10/2018 06:05:44',103)),
(258, convert(DATETIME,'28/09/2018 17:35:00',103), 'Bundle', 'DATA1GB',convert(DATETIME,'08/10/2018 17:35:00',103)),
(258, convert(DATETIME,'19/10/2018 00:27:24',103), 'Bundle', 'DATA1GB',convert(DATETIME,'28/10/2018 23:27:24',103)),
(258, convert(DATETIME,'28/10/2018 11:35:16',103), 'Bundle', 'DATA1GB',convert(DATETIME,'07/11/2018 11:35:16',103)),
(258, convert(DATETIME,'11/10/2018 00:37:43',103), 'Bundle', 'DATA1GB',convert(DATETIME,'21/10/2018 00:37:43',103)),
(258, convert(DATETIME,'04/10/2018 23:46:28',103), 'Bundle', 'DATA1GB',convert(DATETIME,'14/10/2018 23:46:28',103)),
(258, convert(DATETIME,'25/10/2018 04:04:35',103), 'Bundle', 'DATA1GB',convert(DATETIME,'04/11/2018 03:04:35',103)),
(258, convert(DATETIME,'03/10/2018 01:19:39',103), 'Bundle', 'DATA1GB',convert(DATETIME,'13/10/2018 01:19:39',103)),
(258, convert(DATETIME,'25/09/2018 01:54:13',103), 'Bundle', 'DATA1GB',convert(DATETIME,'05/10/2018 01:54:13',103)),
(258, convert(DATETIME,'22/10/2018 22:09:29',103), 'Bundle', 'DATA1GB',convert(DATETIME,'01/11/2018 22:09:29',103));
WITH dateFinder AS
(
SELECT
*
,rowID = ROW_NUMBER() OVER (PARTITION BY MSISDN ORDER BY TransactionTime)
,culc = lead(transactiontime) over (PARTITION BY MSISDN ORDER BY TransactionTime)
FROM dbo.rowBasedTimeCalc
WHERE TransactionKey = 'Bundle'
)
SELECT
dateFinder.MSISDN
,dateFinder.TransactionTime
,dateFinder.TransactionKey
,dateFinder.Reference
,dateFinder.NewExpirationDate
,CulcExpirationDate =
CASE
WHEN dateFinder.rowID = 1 AND culc < dateFinder.NewExpirationDate THEN dateFinder.culc
ELSE NULL
END
FROM dateFinder
DROP TABLE dbo.rowBasedTimeCalc