удалить все, кроме минимальных значений, на основе двух столбцов в таблице SQL Server - PullRequest
2 голосов
/ 24 августа 2009

как написать заявление для выполнения следующего?

Допустим, таблица имеет 2 столбца (оба nvarchar) со следующими данными

col1 10000_10000_10001_10002_10002_10002
col2 10____20____10____30____40_____50

Я бы хотел сохранить только следующие данные:

col1 10000_10001_10002
col2 10____10____30

удаляет дубликаты на основе значений второго столбца (ни один из столбцов не является первичным ключом), сохраняя только те записи с минимальным значением во втором столбце.

как это сделать?

Ответы [ 3 ]

4 голосов
/ 24 августа 2009

Это должно работать для вас:

;
WITH NotMin AS
(
    SELECT Col1, Col2, MIN(Col2) OVER(Partition BY Col1) AS TheMin
    FROM Table1
)

DELETE Table1
--SELECT * 
FROM Table1
INNER JOIN NotMin
ON Table1.Col1 = NotMin.Col1 AND Table1.Col2 = NotMin.Col2 
    AND Table1.Col2 != TheMin 

При этом используется CTE (например, производная таблица, но более чистая) и предложение over в качестве ярлыка для сокращения кода. Я также добавил закомментированный выбор, чтобы вы могли видеть соответствующие строки (проверьте перед удалением). Это будет работать в SQL 2005/2008.

Спасибо, Eric

0 голосов
/ 24 августа 2009

В идеале вы хотели бы сказать:

DELETE
FROM tbl
WHERE (col1, col2) NOT IN (SELECT col1, MIN(col2) AS col2 FROM tbl GROUP BY col1)
1003
DELETE
FROM tbl
FROM tbl
EXCEPT
    SELECT col1, MIN(col2) AS col2 FROM tbl GROUP BY col1

В целом:

DELETE
FROM tbl
WHERE col1 + '|' + col2 NOT IN (SELECT col1 + '|' + MIN(col2) FROM tbl GROUP BY col1)

Или другие обходные пути.

0 голосов
/ 24 августа 2009

Извините, я неправильно понял вопрос.


SELECT col1, MIN(col2) as col2
FROM table
GROUP BY col1

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


DELETE FROM test
WHERE col1 + '|' + col2 NOT IN
(SELECT col1 + '|' + MIN(col2)
FROM test
GROUP BY col1)

Что должно работать при условии, что символ канала никогда не появляется в вашем наборе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...