Выберите повторяющиеся строки на основе разницы во времени и количества вхождений - PullRequest
0 голосов
/ 24 октября 2019

У меня есть такая таблица:

my table

Как видите, некоторые записи с таким же полем farsi_pelak имеютбыло добавлено (обнаружено) более 1 раза в течение нескольких секунд.

Это произошло из-за некоторой ошибки приложения, которая была исправлена.

Теперь мне нужно выбрать изатем удалите дублирующиеся строки, которые были добавлены одновременно (+ - несколько секунд)

И это мой запрос:

SELECT TOP 100 PERCENT
    y.id, y.farsi_pelak , y.detection_date_p , y.detection_time
      FROM dbo._tbl_detection y
          INNER JOIN       
        (SELECT TOP 100 PERCENT
                        farsi_pelak , detection_date_p
                        FROM dbo._tbl_detection WHERE camera_id = 2
                        GROUP BY farsi_pelak , detection_date_p
                        HAVING COUNT(farsi_pelak)>1) dt 
                        ON 
                        y.farsi_pelak=dt.farsi_pelak AND y.detection_date_p =dt.detection_date_p
                        ORDER BY farsi_pelak , detection_date_p DESC

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

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Если вы используете SQL Server 2012 или более позднюю версию, вы можете использовать функцию LAG для получения значений из «предыдущей» строки.

Затем вычислите разницу между смежными временными метками и найдите те строки, где эта разницамал.

WITH
CTE
AS
(
    SELECT
        id
        ,farsi_pelak
        ,detection_date_p
        ,detection_time
        ,LAG(detection_time) OVER (PARTITION BY farsi_pelak 
            ORDER BY detection_date_p, detection_time) AS prev_detection_time
    FROM dbo._tbl_detection
)
,CTE_Diff
AS
(
    SELECT
        id
        ,farsi_pelak
        ,detection_date_p
        ,detection_time
        ,prev_detection_time
        ,DATEDIFF(second, prev_detection_time, detection_time) AS diff
    FROM CTE
)
SELECT
    id
    ,farsi_pelak
    ,detection_date_p
    ,detection_time
    ,prev_detection_time
    ,diff
FROM CTE_Diff
WHERE
    diff <= 10
;

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

WITH
CTE
AS
(
    SELECT
        id
        ,farsi_pelak
        ,detection_date_p
        ,detection_time
        ,LAG(detection_time) OVER (PARTITION BY farsi_pelak 
            ORDER BY detection_date_p, detection_time) AS prev_detection_time
    FROM dbo._tbl_detection
)
,CTE_Diff
AS
(
    SELECT
        id
        ,farsi_pelak
        ,detection_date_p
        ,detection_time
        ,prev_detection_time
        ,DATEDIFF(second, prev_detection_time, detection_time) AS diff
    FROM CTE
)
DELETE
FROM CTE_Diff
WHERE
    diff <= 10
;
0 голосов
/ 24 октября 2019

Я полагаю, что вам нужно округлить число, чтобы проверить время, как показано ниже, сохраняя самые ранние данные времени и отбрасывая время обнаружения покоя для округлостей больше 1

     Select   y.id, y.farsi_pelak , 
     y.detection_date_p , y.detection_time, 
     row_number() over (partition by  
       y.farsi_pelak, 
     y.detection_date_p order by 
      y.detection_time) rn
       from ( the above query)  where rn>1
...