Обновление дубликатов записей на основе даты, поэтому никакие две даты не совпадают - PullRequest
0 голосов
/ 18 декабря 2018
Hkey | Observation dt|      Retriment_dt | Name |Code | Masterkey
---------+------------+------
23        10/8/2018        01/01/3030     Sam     XYZ       99
23        10/8/2018        01/01/3030     Sam     XYZ       98
23        10/8/2018        01/01/3030     Sam     XYZ       97
21        11/8/2018        01/01/3030     JOHN   TGI        65 
21        11/8/2018        01/01/3030     JOHN   TGI        64
21        11/8/2018        01/01/3030     JOHN   TGI        63
30        11/8/2018        01/01/3030     Chris  MNY        70

Хорошо, предположим, что у меня есть эта таблица, и общее количество моих таблиц превышает миллион. Я хочу обновить таблицу (Observation dt и retirement dt) для дублирующихся строк - я не хочу обновлять вседаты наблюдения одной и той же даты, но я хочу, чтобы они отличались на один день.Я вручную ввел это ниже.Как я могу сделать это в Sql или SSIS или на любом языке программирования.Это таблица Mssql Db.Я новичок в SQL и был бы признателен за любую помощь.Спасибо!

Комбинация HKey и Observation_dt является первичным ключом, и когда я применяю ограничение, он выдаст ошибку, поэтому я пытаюсь удалить все дублирующиеся записи, изменив как retirement_dt, так иobservation_dt.Retirement dt будет текущей датой, а observation_dt может быть любой датой-1 (постепенно для каждой повторяющейся даты)

Как это должно выглядеть при выполнении кода

Hkey | Observation dt|      Retriment_dt | Name |Code | Masterkey
---------+------------+------
23        10/8/2018        01/01/3030     Sam     XYZ       99
23        10/7/2018        12/17/2018     Sam     XYZ       98
23        10/6/2018        12/17/2018     Sam     XYZ       97
21        11/8/2018        01/01/3030     JOHN   TGI        65 
21        11/7/2018        12/17/2018     JOHN   TGI        64
21        11/6/2018        12/17/2018     JOHN   TGI        63
30        11/8/2018        01/01/3030     Chris  MNY        70

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Использование таблицы Temp:

Create Table #tbl
(
hkey Int,
Observation Date,
Retriment Date
)
Insert Into #tbl Values
(23,'2018-10-08','3030-01-01'),
(23,'2018-10-08','3030-01-01'),
(23,'2018-10-08','3030-01-01'),
(21,'2018-11-08','3030-01-01'),
(21,'2018-11-08','3030-01-01'),
(21,'2018-11-08','3030-01-01'),
(30,'2018-11-08','3030-01-01')


Select Row_Number() OVER(Order By (Select Null)) As raworder,*  Into #temp From #tbl

Select hkey,
        DateAdd(Day,-Row_Number() Over (Partition By hkey Order By hkey)+1 , Observation) As newDT,  
        Case When (Row_Number() Over (Partition By hkey Order By hkey) = 1) Then Retriment Else Convert(Date,GetDate()) End As Retriment
    From #temp
   Order By raworder

Результат:

hkey    newDT       Retriment
23      2018-10-08  3030-01-01
23      2018-10-07  2018-12-18
23      2018-10-06  2018-12-18
21      2018-11-08  3030-01-01
21      2018-11-07  2018-12-18
21      2018-11-06  2018-12-18
30      2018-11-08  3030-01-01
0 голосов
/ 19 декабря 2018

Мой коллега сделал это аналогичным образом, но спасибо за ответы.Я опубликовал используемый код.

SELECT [healthplanentryhistory_avi_hkey]
    ,[effective_date]
    ,[expiration_date]
    ,[healthplanentryhistoryid]
    ,[hospitalmasterid]
    ,[plancode]
    ,[plangeneration]
    ,[code]
    ,[pawvalue]
    ,[quantitycoveredbyplan]
    ,[healthplanentrymasterid]
    ,[healthplanentryid]
    ,[healthplanid]
    ,[lastupdate]
    ,[origpawvalue]
    ,[active_ind]
    ,[hash_diff]
    ,[source_sys_id]
    ,[create_date]
    ,[update_date]
    ,cnt
    ,Rank
INTO ##tmphph
FROM (
    SELECT *
        ,COUNT(*) OVER (PARTITION BY [healthplanentryhistory_avi_hkey]) AS cnt
        ,RANK() OVER (
            PARTITION BY [healthplanentryhistory_avi_hkey] ORDER BY healthplanentryhistoryid DESC
            ) AS Rank
    FROM [atf_healthplanentryhistory_avi]
    ) AS t
WHERE t.cnt > 1
    AND t.rank > 1
ORDER BY healthplanentryhistoryid DESC;

---SELECT * FROM ##tmphph where healthplanentryhistory_avi_hkey = 0x039E7D809F8138B703FC9991E9D8F655
MERGE INTO [atf_healthplanentryhistory_avi] atf
USING ##tmphph TEMP
    ON atf.healthplanentryhistory_avi_hkey = TEMP.[healthplanentryhistory_avi_hkey]
        AND atf.effective_date = TEMP.effective_date
        AND atf.healthplanentryhistoryid = TEMP.healthplanentryhistoryid
        AND TEMP.rank > 1
WHEN MATCHED
    THEN
        UPDATE
        SET atf.effective_date = getdate() - TEMP.rank /*This will update the effective_date to efective_date - rank#*/
            ,expiration_date = getdate() - TEMP.rank
            ,active_ind = 0;

DROP TABLE ##tmphph
0 голосов
/ 18 декабря 2018

Вы можете использовать следующее решение:

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 день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...