Можно ли сделать регистронезависимый DISTINCT с SAS (PROC SQL)? - PullRequest
8 голосов
/ 29 мая 2009

Есть ли способ получить без учета регистра отдельные строки из этого запроса SAS SQL? ...

SELECT DISTINCT country FROM companies;

Идеальное решение состоит из одного запроса.

Результаты теперь выглядят так:

Australia
australia
AUSTRALIA
Hong Kong
HONG KONG

... где действительно требуется любая из двух отдельных строк

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

Ответы [ 7 ]

6 голосов
/ 29 мая 2009

Если у вас есть какой-то первичный int-ключ (назовем его ID), вы можете использовать:

SELECT country FROM companies
WHERE id =
(
    SELECT Min(id) FROM companies
    GROUP BY Upper(country)
)
2 голосов
/ 29 мая 2009

Не-SQL метод (на самом деле только один шаг, поскольку шаг данных просто создает представление) будет:


data companies_v /view=companies_v;
  set companies (keep=country);
  _upcase_country = upcase(country);
run;

proc sort data=companies_v out=companies_distinct_countries (drop=_upcase_country) nodupkey noequals;
  by _upcase_country;
run;
2 голосов
/ 29 мая 2009

Нормализация регистра действительно представляется целесообразной - если произойдет «Австралия», «Австралия» и «АВСТРАЛИЯ», какой из трех вариантов вы бы хотели, чтобы в качестве «уникального с учетом регистра» ответа на ваш запрос, в конце концов? Если вам интересна какая-то конкретная эвристика (например, подсчитайте, сколько раз они встречаются и выберите наиболее популярную), это, безусловно, можно сделать, но это может быть огромным количеством дополнительной работы - поэтому, сколько стоит такая проницательность для вас

1 голос
/ 29 мая 2009

Может быть, я что-то упускаю, но почему бы просто:

data testZ;
    input Name $;
    cards4;
Bob
Zach
Tim
Eric
Frank
ZacH
BoB
eric
;;;;
run;

proc sql;
    create view distinctNames as
    select distinct Upper(Name) from testz;
quit;

Это создает представление с только разными именами в качестве значений строк.

0 голосов
/ 05 октября 2013

из SAS 9:

proc sort data = input_ds sortseq = лингвистический (strengh = основной);

  by sort_vars;

пробег;

0 голосов
/ 30 мая 2009

Я думал так же, как Зак , но подумал, что я посмотрю на проблему с более сложным примером

proc sql;
    CREATE TABLE contacts (
        line1 CHAR(30), line2 CHAR(30), pcode CHAR(4)
    );
    * Different versions of the same address - L23 Bass Plaza 2199;
    INSERT INTO contacts values('LEVEL 23 bass', 'plaza'  '2199');
    INSERT INTO contacts values('level 23 bass ', ' PLAZA'  '2199');

    INSERT INTO contacts values('Level 23', 'bass plaza'  '2199');
    INSERT INTO contacts values('level 23', 'BASS plaza'  '2199');

    *full address in line 1;
    INSERT INTO contacts values('Level 23 bass plaza', ''  '2199');
    INSERT INTO contacts values(' Level 23 BASS plaza  ', ''  '2199');

;quit;

Теперь мы можем выводить
я. По одному из каждой категории? Т.е. три адреса?
ИЛИ
II. Или только один адрес? если да, то какую версию мы предпочитаем?

Реализация варианта 1 может быть простой:

proc sql;
    SELECT DISTINCT UPCASE(trim(line1)), UPCASE(trim(line2)), pcode 
    FROM contacts 
;quit;

Реализация варианта 2 может быть простой:

proc sql;
    SELECT DISTINCT UPCASE( trim(line1) || ' ' || trim(line2) ) , pcode 
    FROM contacts 
;quit;
0 голосов
/ 29 мая 2009

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

Для регулярного выражения вы можете определить UDF, который можно подготовить с помощью учебника. www.sqlteam.com/article/regular-expressions-in-t-sql

Спасибо.

...