SAS (Proc SQL)와 함께 사례에 민감한 구별을 수행 할 수 있습니까?
문제
이 SAS SQL 쿼리에서 케이스에 민감한 별도의 행을 얻을 수있는 방법이 있습니까? ...
SELECT DISTINCT country FROM companies;
이상적인 솔루션은 단일 쿼리로 구성됩니다.
결과는 이제 다음과 같습니다.
Australia
australia
AUSTRALIA
Hong Kong
HONG KONG
... 2 개의 뚜렷한 행 중 하나가 실제로 필요한 곳
데이터를 상단 할 수는 있지만이 쿼리의 목적에 맞지 않는 방식으로 불필요하게 값이 변경됩니다.
해결책
기본 INT 키 (ID라고 부르면)가 있으면 다음을 사용할 수 있습니다.
SELECT country FROM companies
WHERE id =
(
SELECT Min(id) FROM companies
GROUP BY Upper(country)
)
다른 팁
'호주', '호주'및 '호주'가 모두 발생한다면 사례를 정상화하는 것이 좋습니다. 결국 쿼리에 대한 "사례에 민감하게 고유 한"대답으로 세 가지 중 하나를 원하는 세 가지 중 하나는 무엇입니까? 특정 휴리스틱에 열중하고 (예 : 몇 번이나 발생하는지 세고 가장 인기있는 것을 선택하십시오), 이것은 반드시 할 수 있지만 많은 양의 추가 작업 일 수도 있습니다. ?
비 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;
어쩌면 내가 뭔가를 놓치고 있을지 모르지만 왜 그냥 :
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;
이것은 행 값으로 별개의 이름 만있는 뷰를 만듭니다.
나는 같은 줄을 따라 생각하고 있었다 Zach, 그러나 더 정교한 예로 문제를 볼 것이라고 생각했습니다.
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;
SAS 9에서 :
Proc Sort Data = input_ds sortseq = Linguistic (Strengh = 1 차);
by sort_vars;
운영;
정규 표현식이 검색 문자열에 원하는 패턴으로 도움이 될 수 있다고 생각합니다.
정규 표현을 위해서는 튜토리얼을 볼 준비가 될 수있는 UDF를 정의 할 수 있습니다. www.sqlteam.com/article/regular-expressions-in-t-sql
감사.