SQL - Как я могу удалить повторяющиеся строки по последнему введенному значению? - PullRequest
7 голосов
/ 23 января 2012

У меня есть этот код по этой ссылке: Как удалить дублирующиеся строки?

 ;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work, hours
                                   ORDER BY ( SELECT 0)) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1

Можно ли удалить первый введенный ряд дубликатов или у меня должен быть дополнительный столбецdate_of_entry?Я хочу сделать это, если я ввел одну и ту же дату и разные часы PARTITION BY person_id, date_work, чтобы удалить случайные дубликаты.

Если это невозможно, как я могу удалить дубликаты с большим количеством часов?

Ответы [ 3 ]

6 голосов
/ 23 января 2012

Добавить order by hours desc

;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work
                                   ORDER BY hours DESC) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1
4 голосов
/ 23 января 2012

Да - вы или должны ввести поле date_of_entry или другое векторное поле, например IDENTITY.Например, если столбец Id является вашим INT IDENTITY, то ваш запрос будет выглядеть следующим образом:

 ;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work, hours
                                   ORDER BY ( SELECT Id DESC)) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1

Конечно, действительно, если никто не изменяет значения в IDENTITYcolumn

И если ваши условия удовлетворяют - тогда вы можете использовать столбец Hours в качестве векторного поля в пределах диапазона группировки person_id, date_work

И еще лучше должен иметь UNIQUE INDEX над столбцами person_id, date_work, hours, тогда не будет никакой возможности добавлять дубликаты.

3 голосов
...