SAS (Proc SQL)와 함께 사례에 민감한 구별을 수행 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/924513

  •  06-09-2019
  •  | 
  •  

문제

이 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

감사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top