Удалить частичные двойные строки - sql

sql-server

86 просмотра

2 ответа

У меня возникли проблемы с удалением частично дублированных строк

Структура выглядит так:

+-----+--------+--+-----------+--+------+
| id  | userid |  | location  |  | week |
+-----+--------+--+-----------+--+------+
|   1 |    001 |  | amsterdam |  |   11 |
|   2 |    001 |  | amsterdam |  |   23 |
|   3 |    002 |  | berlin    |  |   28 |
|   4 |    002 |  | berlin    |  |   22 |
|   5 |    003 |  | paris     |  |   19 |
|   6 |    003 |  | paris     |  |   35 |
+-----+--------+--+-----------+--+------+

Мне нужно только сохранить одну строку от каждого идентификатора пользователя, не имеет значения, какой у нее номер недели.

Спасибо, Максим

Автор: Maxcim Источник Размещён: 08.11.2019 11:00

Ответы (2)


1 плюс

Решение

Это должно работать в большинстве баз данных:

DELETE
FROM yourTable
WHERE id <> (SELECT MIN(id)
              FROM yourTable t
              WHERE t.userid = userid)

Этот запрос удалит из каждой useridгруппы все записи, кроме записи, имеющей наименьшее значение idдля этой группы. Я предполагаю, что idэто уникальный столбец.

Автор: Tim Biegeleisen Размещён: 20.08.2016 07:31

0 плюса

Этот метод проверен, попробуйте. Мы получаем количество строк, встречающихся в каждой записи, а затем удаляем только те, у которых более 1 строки ... сохраняя исходную.

BEGIN TRANSACTION

SELECT UserID, Location,
RN = ROW_NUMBER()OVER(PARTITION BY UserID, Location ORDER BY UserID, Location)
into #test1
FROM dbo.MyTbl

Delete MyTbl
From MyTbll
INNER JOIN #test1
ON #test1.UserID= MyTbl.UserID
WHERE RN > 1
if @@Error <> 0 GOTO Errlbl


Commit Transaction
RETURN

Errlbl:
    RollBack Transaction

GO
Автор: Zeina Размещён: 20.08.2016 07:42
Вопросы из категории :
32x32