2013-05-08 3 views
4

При работе с некоторыми устаревшими данными я хочу сгруппировать данные по столбцу, игнорируя орфографические ошибки. Я думаю, что SOUNDEX() может выполнить эту работу, чтобы достичь желаемого результата. Вот то, что я пробовал:Как группировать по столбцам с орфографическими ошибками

SELECT soundex(AREA) 
FROM MASTER 
GROUP BY soundex(AREA) 
ORDER BY soundex(AREA) 

Но (очевидно) SOUNDEX возвращается код 4 символов в строки результата, как это, потерять реальные строки:

A131 
A200 
A236 

Как я мог включать, по меньшей мере, одно вхождение из группа в результат запроса вместо 4-символьного кода.

+2

с помощью MIN (или MAX) AREA будет делать трюк, как ответил flaschenpost. – Serge

+2

+1 Для ясного вопроса и обучения мне о какой-либо функции, которую я не знал, существовал. – Bryan

ответ

4
SELECT soundex(AREA) as snd_AREA, min(AREA) as AREA_EXAMPLE_1, max(AREA) as AREA_EXAMPLE_2 
from MASTER 
group by soundex(AREA) 
order by AREA_EXAMPLE_1 
; 

В MySQL вы можете выбрать GROUP_CONCAT (отчетливая область), как list_area получить все версии, и я не знаю о том, что в SQL-сервере, но минимальные и максимальные два примера областей, и вы все равно отказались от различий.

+0

Он работал, но с поразительными результатами. Например, soundex() группирует NORTH NAZ и NORTH KAR, P.I.B. и P.E.C.H, SHAH FAISAL и S.I.T.E. ??? !!!! –

+0

Возможно, вы можете управлять функцией soundex в SQL-Server. Я только имею доступ к MySQL, и там я получаю soundex («NORTH NAZ») = N6352, soundex («NORTH KAR» = N6326. Или, возможно, есть еще разные функции soundex. – flaschenpost

+0

Я попытался удалить пробелы из строки (NORTHNAZ и NORTHKAR), но на самом деле SOUNDEX() является соответствие слишком свободно, например, следующие строки производят одни и те же коды SOUNDEX;. <<< выберите SOUNDEX (col1), col1 из ( выберите 'Гульбагаре', как col1 союза ALL выберите '' Gulberg ) т >>> ** <<< выберите SOUNDEX (col1), col1 из ( выберите 'GULSHANEIQBAL', как col1 UNION ALL Выбрать 'GULSHANEMAYMAR' ) t >>> ** Любая идея, или мне нужно создать новую тему для этой еще одной проблемы? –

4

Вы также можете использовать row_number(), чтобы получить одну строку для каждого soundex(area) значения:

select AREA, snd 
from 
(
    select AREA, soundex(AREA) snd, 
    row_number() over(partition by soundex(AREA) 
         order by soundex(AREA)) rn 
    from master 
) x 
where rn = 1 

См SQL Fiddle with Demo

+0

Ваше решение не будет включать в себя какие-либо события из группы. Мне не нужен номер строки. –

+0

@ Ali.NET Вы просили получить одно значение от каждой группы, которая это делает. Вы видели демо? – Taryn

+0

ОК, я понял. это. Благодарю. :) –

Смежные вопросы