Ключевая переменная Hash Merge имеет пробелы - PullRequest
0 голосов
/ 07 декабря 2018

Я сейчас изучаю слияние хэша и немного борюсь здесь.

Первый вопрос: при слиянии хешей какую таблицу нужно хешировать, а какую - читать при использовании оператора set?В приведенном ниже примере Tablex находится на сервере SQL и имеет несколько миллионов записей.Table1 имеет на 10% больше записей, чем Tablex, и находится в моей рабочей папке temp.

Я хочу выбрать только записи из Таблицы X, которые появляются в Таблице 1, будет ли приведенный ниже код хорошим способом сделать это?Что бы я сделал, если бы я также хотел поставить условие для TableX, скажем, где дата открытия> '01 DEC 2010'd

Также возможно ли иметь переменную с пробелами в качестве ключевой переменной или мне нужносделать бит переименования?

Data merges;
    if 0 then set server.Tablex(rename='account number'n= 
                  account_number_full2) table1;
    if _n_ = 1 then do;
        declare hash tab2(dataset:'table1');
                tab2.defineKey('Account_Number_full');
                tab2.defineData(all:'YES');
                tab2.defineDone();
    end;


    set Tablex(rename='account number'n= account_number_full2);


    if tab2.find(key:account_number_full2) = 0
    then output;
run;

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Переменная names в хэше может содержать любой символ, только если сеанс SAS включен

option validvarname = any;

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

При ссылке на столбец с необычным именем в коде шага DATA у вас будетиспользовать синтаксис имени-литерала SAS (в кавычках следует N), однако при передаче имени столбца хеш-конструкторам (в виде строки) вы будете использовать имя, а не имя-литерал:

"<column-name>"N

Пример кода:

options validvarname = any;

data have;
  "my key name is spacey"N = "key-1";  **** name-literal syntax used here;
  x = 123;
run;

data _null_;
  if 0 then set have; * prep pdv;
  if _n_ = 1 then do;
    declare hash h(dataset:'have');
    h.defineKey("my key name is spacey");  **** name with spaces passed here;
    h.defineData("x");
    h.defineDone();
  end;

  'my key name is spacey'N = "key-0";   **** name-literal used here;
  rc = h.find();
  put rc= x=;

  'my key name is spacey'N = "key-1";  **** name-literal used here;
  rc = h.find();
  put rc= x=;    
run;

Что касается объединения.

  • УСТАНОВИТЬ удаленную таблицу
  • Применить where к удаленной таблице.Ядро базы данных SQLSRV передает критерии в SQL и применяет их перед отправкой данных по «проводу» обратно на шаг DATA.
  • Если имя ключевой переменной совпадает в таблице x и в таблицепоиск, вы можете использовать более простой hash.find().hash.find(key:<expression>) требуется только тогда, когда имена не совпадают, или ключ в одном домене должен быть преобразован до того, как он станет подходящим поиском (например, поиск совпадения при входе в систему по паролю будет работать только после того, как введенный текст будет хеширован, а затем сравненосвоить таблицу логина)
0 голосов
/ 07 декабря 2018

давайте попробуем разобраться на примере.то, что вы упомянули в операторе set, является выходом в этом случае таблицы have1.Ваш хеш-стол есть есть.если n = 0, то набор have1 необходим только для таблицы set.Вам не нужно все для хеш-таблицы, так как вы не используете эти данные для вашей окончательной выходной таблицы.

data have;
input id value $;
datalines;
1   A
2   B
3   C
4   D
;

data have1;
  input id date:mmddyy10.;
 format date mmddyy10.;
 datalines;
 2 01/15/2018
 3 01/01/2017
;

Data merges;
if 0 then set have1;
if _n_ = 1 then do;
    declare hash tab2(dataset:'have');
            tab2.defineKey('id');
            tab2.defineDone();
end;


set have1;


if tab2.find(key:id) = 0
;
run;

, если вы хотите включить дату, вы можете сделать предложение where в качестве параметров набора данныхкак показано ниже.

    Data merges;
if 0 then set have1;
if _n_ = 1 then do;
 declare hash tab2(dataset:'have');
        tab2.defineKey('id');
        tab2.defineDone();
 end;


  set have1(where= (date gt '01JAN2018'd));


  if tab2.find(key:id) = 0;
  run;
...