2017-01-24 3 views
0

У меня есть таблица достойного размера с 20 + столбцами и почти 3 миллионами строк, и я хочу выбрать все уникальные значения из одного столбца и ввести их во вновь созданную таблицу. После исследования я попытался использовать это с использованием как DISTINCT, так и GROUP BY, но оба они производят повторяющиеся значения. Кроме того, я установил новый столбец в новой таблице в качестве Первичного ключа, который, как я полагаю, не допускает дублирования значений.SQL SELECT DISTINCT и GROUP Оба производят дубликаты

Я определенно новичок здесь, поэтому, возможно, есть что-то простое, я делаю неправильно. Вот некоторые примеры кода:

Использование GROUP BY

INSERT INTO ResourceGroups(ResourceGroup) 
SELECT ResourceGroup 
FROM dbo.UsageData 
WHERE ResourceGroup IS NOT NULL 
GROUP BY ResourceGroup 

Использование DISTINCT

INSERT INTO ResourceGroups(ResourceGroup) 
SELECT DISTINCT ResourceGroup 
FROM dbo.UsageData 
WHERE ResourceGroup IS NOT NULL 

Результаты обоих из них, кажется, то же самое. Вот пример из первых нескольких строк:

ResourceGroup 

aiiInnovationTime 
Api-Default-Central-US 
Api-Default-Central-US 
applicationinsights 
applicationinsights 
azurefunctions-southeastasia 
azurefunctions-southeastasia 

Запрос в результате 532 строк, и он явно устранены некоторые дубликаты после консолидации вниз с 3 млн. Тем не менее, здесь, очевидно, все еще есть дубликаты, и они также успешно вставлены в столбец первичного ключа, который не должен дублировать. Кроме того, есть пустая строка, несмотря на мою попытку отфильтровать NULL (хотя, может быть, есть место или что-то там?). Излишне говорить, что я немного смущен тем, что я делаю неправильно, и буду очень признателен за любую помощь, которую может предоставить это сообщество!

+1

Для повторяющихся значений вы можете проверить начальные и/или конечные пробелы. –

+1

Что произойдет, если вы удалите строку «INSERT INTO» и просто запустите «SELECT» (в любом из случаев)? Какие строки вы вернетесь? Это то, чего вы ожидали? (Первое, вероятно, не удалось, потому что у вас нет функции агрегации в вашем SELECT. Что показывает вторая?) –

+0

Совет сегодня: используйте GROUP BY, когда задействованы агрегированные функции, иначе используйте SELECT DISTINCT для устранения дубликатов. – jarlh

ответ

0

Предполагая, что есть пробелы в данных

SELECT DISTINCT 
REPLACE(REPLACE(REPLACE(REPLACE(ResourceGroup, CHAR(13) + CHAR(10), ' ... '), 
     CHAR(10) + CHAR(13), ' ... '), CHAR(13), ' '), CHAR(10), ' ... ') 
    FROM dbo.UsageData 
    WHERE LTRIM(RTRIM(ResourceGroup)) IS NOT NULL 

LTRIM обрезает начальные пробелы и RTRIM обрезает конечные пробелы. Попробуйте это и посмотрите, работает ли это!

+0

(извините, если вы получаете спам с уведомлениями о комментариях, я новичок в этом, и я пытаюсь сделать форматирование удобочитаемым). TL; DR, запрос не работал, но я думаю, что я обнаружил, почему. Я открыл результаты в Notepad ++ и обнаружил, что повторяющиеся значения, похоже, имеют дифференциации в невидимых символах.Это выглядит следующим образом: "Апи-Default-Центрально-США [CR] " [CR] [LF] Апи-Default-Центрально-США [CR] [LF] Так один значение имеет набор цитат и дополнительный возврат каретки, в то время как второе, казалось бы, дублирующее значение не имеет кавычек и одного набора [CR] [LF]. Как мне объяснить это? – JLantz

+0

Это, похоже, выявило проблему в моих исходных данных, где более старые данные имеют только кавычки вокруг значений выбора, которые требуются, тогда как более новые данные имеют кавычки вокруг каждого значения. Так что теперь мне нужно выяснить, как стандартизировать все это. – JLantz

+0

Я пытаюсь заменить и посмотреть, работает ли это для вас! –

0

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

В зависимости от БД вы можете изменить запрос, например.

Для Oracle DB: Вы можете использовать функцию TRIM, которая удаляет как верхние, так и конечные белые пробелы.

SQL Server Не имеет одну функцию, вы должны использовать LTRIM и RTRIM удалить пробелы.