2016-10-19 3 views
-1

У меня есть одна таблица, как показано ниже картинки, которая указывает некоторые дублированные строки. Я могу найти дублированные строки, но я не смог удалить их из-за отсутствия какого-либо уникального идентификатора, который я могу отличить. Было много дублированных строк, подобных тому, что было в той же таблице. Я просто скриншот часть этого.Как удалить повторяющиеся строки при сохранении оригинальной записи?

В результате, согласно приведенному ниже рисунку, как я могу удалить дублированные строки, но сохранить оригинал?

enter image description here

+1

MySQL или T-SQL? Один вариант, в зависимости от размера таблицы, может быть только для создания временной таблицы. Заполните его уникальными записями, выполнив 'SELECT DISTINCT' из вашей текущей таблицы. Усекайте текущую таблицу. Скопируйте всю таблицу temp в усеченную таблицу. – Santi

+0

Возможный дубликат [Как удалить повторяющиеся строки?] (Http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows) – Ivar

+0

@Ivar это немного другая проблема, в этом нет первичного ключа или уникального идентификатора. – Santi

ответ

0

Одно решение, которое вы могли бы рассмотреть возможность копирует все уникальные записи во временную таблицу, таким образом удаляя дубликаты. Затем вы можете усечь исходную таблицу и повторно заполнить ее из созданной временной таблицы. Код будет выглядеть примерно так:

SELECT DISTINCT * INTO #tempTable FROM MyTable 

TRUNCATE TABLE MyTable; 
INSERT INTO MyTable (LocationID, UnitID, CameraID ... IsActiveHours) 
SELECT LocationID, UnitID, CameraID ... IsActiveHours FROM #tempTable; 

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

0

Чтобы выполнить это, вы можете использовать cte и Row_Number(). Если вы удовлетворены результатами, удалите окончательный выбор и не комментируйте заявление об удалении

;with cte as (
    Select *,RowNr=Row_Number() over (Partition By LocationId Order by Date_T) 
    From YourTable 
) 
Select * from cte Where RowNr>1 
-- Delete From cte Where RowNr>1 
0

Это вопрос, который исправит эту проблему.

WITH X AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY LocationId,date_t ORDER BY LocationId desc) as 'rownum',LocationId, 
    date_T AS T 
    FROM Counts 
    ) 
    --SELECT * FROM X WHERE rownum >1 

DELETE FROM X 
WHERE rownum <> 1 
0

Вы бы лучше, добавив столбец идентификаторов, чтобы сделать вещи проще, однако это может быть сделано без TRUNCATE с помощью следующего:

--GET DUPLICATE ROWS INTO A TEMP TABLE (YOU MAY NOT NEED TO USE ALL THE COLUMNS TO IDENTIFY A DUPLICATE) 
    SELECT ROW_NUMBER() OVER (ORDER BY ColA) AS RowNo, ColA, ColB, ColC, COUNT(*) As [Count] 
    INTO #TEMP1 
    FROM test 
    GROUP BY ColA, ColB, ColC 
    HAVING COUNT(*) > 1 

    --LOOP THROUGH DUPLICATES 
    DECLARE @RowNo INT 
    DECLARE @Duplicates INT 

    SET @RowNo = 1 

    WHILE EXISTS(SELECT * FROM #TEMP1) 
    BEGIN 

     --GET A COUNT OF ADDITIONAL ROWS FOR THIS DUPLICATE 
     SET @Duplicates = (SELECT [Count] FROM #TEMP1 WHERE RowNo = @RowNo) - 1 

     --DELETE THE ROWS WE DONT NEED 
     DELETE TOP (@Duplicates) t1 
     FROM test t1 
     JOIN #TEMP1 t2 ON t1.ColA = t2.ColA AND t1.ColB = t2.ColB AND t1.ColC = t2.ColC 
     WHERE t2.RowNo = @RowNo 

     --REMOVE THE ROW FROM THE TEMP TABLE 
     DELETE FROM #TEMP1 WHERE RowNo = @RowNo 

     --INCREASE THE ROW NO TO MOVE TO THE NEXT ROW 
     SET @RowNo = @RowNo + 1 
    END 

    --DROP THE TEMP TABLE 
    DROP TABLE #TEMP1 
Смежные вопросы