SAS (PROC SQL) で大文字と小文字を区別しない DISTINCT を実行することは可能ですか?

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)
)

他のヒント

ノーマライズ場合は賢明に見えるん - 'オーストラリアの場合は、「オーストラリア」と「オーストラリアは、」すべての後にすべての、3の1はあなたのクエリに「大文字敏感にユニークな」答えとして必要と思われる、起こりますか?あなたには、いくつかの特定のヒューリスティック(例えば、それらが発生した回数をカウントし、最も人気を選ぶ)に熱心であれば、これは確実に行うことができますが、余分な作業の膨大な量であるかもしれない - そう、そのようpersnicketinessはあなたに価値がどのくらいあります?

非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;

これは、行の値としてのみ異なる名前を持つビューを作成します。

私も同じような考えでした ザック, 、しかし、より複雑な例で問題を見ていこうと思いました、

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;

これで出力できるようになりました
私。各カテゴリから 1 つずつ?つまり、アドレスが 3 つありますか?
または
ii.それとも 1 つのアドレスだけですか?もしそうなら、どのバージョンを優先すべきですか?

ケース 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ソートデータ= input_ds SORTSEQ =言語(strengh =プライマリ)

  by sort_vars;

実行します。

私は正規表現を使用すると、検索文字列にしたいパターンであなたを助けることができると思います。

正規表現のためには、チュートリアルを見て調製することができるUDFを定義することができます。 www.sqlteam.com/article/regular-expressions-in-t-sql

感謝します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top