Вы можете использовать следующее решение:
IF OBJECT_ID('tempdb..#YourTable') IS NOT NULL
DROP TABLE #YourTable
SELECT
V.Hkey,
[Observation dt] = CONVERT(DATE, V.[Observation dt]),
[Retriment_dt] = CONVERT(DATE, V.[Retriment_dt])
INTO
#YourTable
FROM
(VALUES
(23,'2018-08-10','3030-01-01'),
(23,'2018-08-10','3030-01-01'),
(23,'2018-08-10','3030-01-01'),
(21,'2018-08-10','3030-01-01'),
(21,'2018-08-10','3030-01-01'),
(21,'2018-08-10','3030-01-01'),
(30,'2018-08-10','3030-01-01')) V(Hkey, [Observation dt], [Retriment_dt])
;WITH DuplicateRecords AS
(
SELECT
T.HKey,
T.[Observation dt]
FROM
#YourTable T
GROUP BY
T.HKey,
T.[Observation dt]
HAVING
COUNT(1) > 1
),
RowNumber AS
(
SELECT
T.Hkey,
T.[Observation dt],
T.[Retriment_dt],
RowNumberByHkey = ROW_NUMBER() OVER (PARTITION BY T.Hkey ORDER BY T.[Observation dt], T.[Retriment_dt])
FROM
#YourTable AS T
INNER JOIN DuplicateRecords AS D ON
T.Hkey = D.Hkey AND
T.[Observation dt] = D.[Observation dt]
),
UpdatedValues AS
(
SELECT
R.Hkey,
R.[Observation dt],
R.[Retriment_dt],
NewObservationDT = DATEADD(
DAY,
-1 * (R.RowNumberByHkey - 1),
R.[Observation dt]),
NewRetirementDT = GETDATE(),
R.RowNumberByHkey
FROM
RowNumber AS R
),
RecordsToUpdate AS
(
-- Need a row number to be able to update correctly, since the record is duplicated (need an ID to join)
SELECT
T.Hkey,
T.[Observation dt],
T.[Retriment_dt],
RowNumberByHkey = ROW_NUMBER() OVER (PARTITION BY T.Hkey ORDER BY T.[Observation dt], T.[Retriment_dt])
FROM
#YourTable AS T
)
UPDATE T SET
[Observation dt] = R.NewObservationDT,
[Retriment_dt] = R.NewRetirementDT
FROM
RecordsToUpdate AS T
INNER JOIN UpdatedValues AS R ON
T.HKey = R.HKey AND
T.[Observation dt] = R.[Observation dt] AND
T.RowNumberByHkey = R.RowNumberByHkey
SELECT
*
FROM
#YourTable AS T
ORDER BY
T.Hkey,
T.[Observation dt] DESC
Результат:
Hkey Observation dt Retriment_dt
21 2018-08-10 2018-12-18
21 2018-08-09 2018-12-18
21 2018-08-08 2018-12-18
23 2018-08-10 2018-12-18
23 2018-08-09 2018-12-18
23 2018-08-08 2018-12-18
30 2018-08-10 3030-01-01
Это было немного сложно, потому что вам нужно обновлять дублирующиеся записи с разными значениями, поэтому вам нужночтобы сгенерировать какой-то уникальный идентификатор (я использовал номер строки), чтобы иметь возможность их сопоставлять.
Способ генерирования разных дней состоял в том, чтобы применить DATEADD
с номером строки, который был разделен на HKey
.Это создает разные дни с разницей в 1 день.