2010-09-17 2 views
0

Из-за ошибки в системе журнал отслеживания многократно срабатывал, что приводило к тому, что должна была быть одна запись в журнале, чтобы фактически быть в сотнях. Это было разрешено, но данные все еще существуют и должны быть для отчетности (я не могу просто удалить все это). Однако мне нужен только один экземпляр данных. Это будет сложно, я думаю, здесь есть соответствующие поля в таблице:Удалите все, кроме одного, повторяющиеся строки, где значения столбца datetime находятся в секундах друг от друга?

INT UserID, внутр ActorID, NVARCHAR (50) ActorType, внутр BoxID, даты и времени CreateDate, NVARCHAR (50) Запрос

Теперь для каждой строки, где все они идентичны, а разница в CreateDate находится в пределах, скажем, 30 секунд друг от друга, я хочу удалить все эти строки, кроме одного.

Таким образом, все данные в полях, перечисленных будет точно соответствовать и CreateDate будет колебаться, как:

2010-08-17 14:50:11.620 
2010-08-17 14:50:11.823 
2010-08-17 14:50:12.057 
2010-08-17 14:50:12.277 
2010-08-17 14:50:12.527 
2010-08-17 14:50:12.730 
2010-08-17 14:50:12.980 
2010-08-17 14:50:13.340 
2010-08-17 14:50:13.450 
2010-08-17 14:50:13.667 
2010-08-17 14:50:13.887 
2010-08-17 14:50:14.120 
2010-08-17 14:50:14.323 
2010-08-17 14:50:14.730 
2010-08-17 14:50:14.807 
2010-08-17 14:50:15.010 
2010-08-17 14:50:15.357 
... 
2010-08-17 14:51:09.810 
2010-08-17 14:51:10.047 
2010-08-17 14:51:10.250 
2010-08-17 14:51:10.500 
2010-08-17 14:51:10.890 
2010-08-17 14:51:10.953 
2010-08-17 14:51:11.263 
2010-08-17 14:51:11.437 
2010-08-17 14:51:11.920 
2010-08-17 14:51:12.170 
2010-08-17 14:51:12.217 
2010-08-17 14:51:12.420 
2010-08-17 14:51:12.670 
2010-08-17 14:51:12.873 
2010-08-17 14:51:13.123 
2010-08-17 14:51:13.373 
2010-08-17 14:51:13.577 
2010-08-17 14:51:13.797 
2010-08-17 14:51:14.030 
2010-08-17 14:51:14.280 
2010-08-17 15:29:19.180 
2010-08-17 15:32:32.497 
2010-08-17 15:32:32.733 
2010-08-17 15:32:32.967 
2010-08-17 15:32:33.263 
2010-08-17 15:32:33.513 
2010-08-17 15:32:33.623 
2010-08-17 15:32:33.857 
2010-08-17 15:32:34.140 
2010-08-17 15:32:34.327 
2010-08-17 15:32:34.560 
2010-08-17 15:32:34.780 
2010-08-17 15:32:35.043 
2010-08-17 15:32:35.247 
2010-08-17 15:32:35.483 
2010-08-17 15:32:35.717 

Но я только один держать один, я надеюсь, что это достаточно информации.

ответ

1

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

WITH cte AS 
    (SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, 
     DATEDIFF(ss, '1/1/2000', CreateDate)/30 AS CreateDateGroup, 
     ROW_NUMBER() OVER (PARTITION BY UserID, ActorID, ActorType, BoxID, Query, 
            DATEDIFF(ss, '1/1/2000', CreateDate)/30 
          ORDER BY CreateDate ASC) AS sequence 
    FROM TrackingLog 
    ) 

SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, CreateDateGroup, sequence 
FROM cte 
WHERE sequence = 1 

В колонке общего назначения (CTE) создаются две колонки. Столбец CreateDateGroup вычисляется путем преобразования значения CreateDate в число секунд с «1/1/2000» и делится на 30 (как в секундах). Результатом является целое число, поэтому дробная часть усекается.

Столбец последовательности - это номер строки внутри группы и упорядочен по CreateDate в порядке возрастания. Таким образом, самым старым дате в каждой группе будет последовательность 1.

Основной запрос включает WHERE sequence = 1, что означает, что вы хотите видеть первую строку в каждой группе.

Когда вы будете готовы, чтобы удалить ненужные строки, вы бы изменить главный вопрос как следующее:

WITH cte AS 
    (SELECT UserID, ActorID, ActorType, BoxID, Query, CreateDate, 
     DATEDIFF(ss, '1/1/2000', CreateDate)/30 AS CreateDateGroup, 
     ROW_NUMBER() OVER (PARTITION BY UserID, ActorID, ActorType, BoxID, Query, 
            DATEDIFF(ss, '1/1/2000', CreateDate)/30 
          ORDER BY CreateDate ASC) AS sequence 
    FROM TrackingLog 
    ) 

DELETE 
FROM cte 
WHERE sequence > 1 
; 

Эта команда удалит все строки из таблицы, которые не первый ряд каждой группы.

0

группа по всем полям, кроме метки времени, и принимает значение max (timestamp_field)?

Смежные вопросы