Добавление миллисекунд в таблицу, где есть дублирующиеся дата и время - PullRequest
0 голосов
/ 11 июня 2019

Я работаю с временной таблицей, я не уверен, имеет ли это значение, она создается так:

CREATE TABLE #ActivityLog 
(
     ActivityLogID UNIQUEIDENTIFIER,
     VehicleID UNIQUEIDENTIFIER,
     ActivityDateTime DATETIME
)

Я пытаюсь манипулировать таблицей, чтобы у меня не былоActivityDateTime дублируется за VehicleID.

С помощью этого запроса я получаю свои дублированные значения.

SELECT
    s.ActivityLogID, t.* 
FROM
    #ActivityLog s 
JOIN
    (SELECT 
         VehicleID, ActivityDateTime, COUNT(*) AS qty
     FROM 
         #ActivityLog
     GROUP BY 
         VehicleID, ActivityDateTime
     HAVING
         COUNT(*) > 1) t ON s.VehicleID = t.VehicleID 
                         AND s.ActivityDateTime = t.ActivityDateTime 
ORDER BY
    t.qty DESC

Моя проблема в том, что я понятия не имею, как их перебрать, чтобывозможность добавлять 3 миллисекунды (наименьшее время обрабатывается SQL) при обнаружении дубликатов.

Поэтому, если у меня есть несколько строк, подобных приведенным ниже (я упросту uniqueID, чтобы они легче отображались)

ActivityLogID  |      VehicleID  |     ActivityDateTime     
---------------+-----------------+--------------------------
     1                     9         2019-06-03 18:48:53.000    
     2                     9         2019-06-03 18:48:53.000    
     3                     9         2019-06-03 18:48:53.000    
     4                     9         2019-06-03 18:48:53.000    
     5                     9         2019-06-03 18:48:53.000    
     6                     9         2019-06-03 18:48:53.000    
     7                     9         2019-06-03 18:49:53.000    
     8                     9         2019-06-03 18:50:53.000    
     9                     9         2019-06-03 18:50:53.000    
     10                    9         2019-06-03 18:51:53.000    
     11                    9         2019-06-03 18:51:53.000    
     12                    9         2019-06-03 18:52:53.000

Вывод должен выглядеть как

ActivityLogID  |      VehicleID  |     ActivityDateTime     
---------------+-----------------+--------------------------
     1                     9         2019-06-03 18:48:53.000    
     2                     9         2019-06-03 18:48:53.003    
     3                     9         2019-06-03 18:48:53.006    
     4                     9         2019-06-03 18:48:53.009    
     5                     9         2019-06-03 18:48:53.012    
     6                     9         2019-06-03 18:48:53.015    
     7                     9         2019-06-03 18:49:53.018    
     8                     9         2019-06-03 18:50:53.000    
     9                     9         2019-06-03 18:50:53.003    
     10                    9         2019-06-03 18:51:53.000    
     11                    9         2019-06-03 18:51:53.003    
     12                    9         2019-06-03 18:52:53.000

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Изменение данных звучит как плохая идея.Я бы добавил 5 миллисекунд, чтобы быть в безопасности, используя row_number().Итак:

Select s.*,
       dateadd(millisecond,
               (row_number() over (partition by VehicleID, ActivityDateTime order by (select null)) - 1) * 5,
               ActivityDateTime
              ) as munged_ActivityDateTime
from #ActivityLog s
order by t.qty desc 
0 голосов
/ 11 июня 2019

Используя технику, предложенную Гордоном, в CTE вы можете обновить таблицу.Примерно так:

WITH CTE AS (
 SELECT *, 
 row_number() over (partition by VehicleID, ActivityDateTime order by (select null)) as rownum
 from #ActivityLog
)
UPDATE CTE SET ActivityDateTime = DATEADD(millisecond,(rownum-1)*3, ActivityDateTime)
WHERE rownum>1;

И могу я также предложить, если вы не хотите повторять дубликаты для VehicleID и ActivityDateTime, создайте уникальное ограничение для таблицы.

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