Sugif 12 3 2014 by Heikki Herva HASHObjekti
Sugif 12. 3. 2014 by Heikki Herva HASH-Objekti ”Taulukkotietorakenne”
/******************* * Yhdistely perinteisellä Mergellä. * *******************/ * Ensiksi lajitellaan ensimmäinen taulu; proc sort data=asiakas_perustiedot out=asiakas_perustiedot_s; by pankki astun; run; NOTE: There were n observations read from the data set ASIAKAS_PERUSTIEDOT. NOTE: The data set ASIAKAS_PERUSTIEDOT_S has n observations and n variables. NOTE: PROCEDURE SORT used (Total process time): real time 2: 52. 24 cpu time 1: 43. 17 * Toiseksi lajitellaan toinen taulu; proc sort data=asiakaskokonaisuudet out=asiakaskokonaisuudet_s; by pankki astun; run; NOTE: There were n observations read from the data set ASIAKASKOKONAISUUDET. WHERE tyyppi_kd='R'; NOTE: The data set ASIAKASKOKONAISUUDET _S has n observations and n variables. NOTE: PROCEDURE SORT used (Total process time): real time 1. 33 seconds cpu time 0. 57 seconds
* Sitten Merge; data asiakas_ja_osallisuus_mergella; merge asiakas_perustiedot_s (in=ap) asiakaskokonaisuudet_s (in=ao); by pankki astun; if ap; run; NOTE: There were n observations read from the data set ASIAKAS_PERUSTIEDOT_S. There were n observations read from the data set ASIAKASKOKONAISUUDET_S. The data set WORK. ASIAKAS_JA_OSALLISUUS_MERGELLA has n observations and n variables. DATA statement used (Total process time): real time 2: 23. 97 cpu time 1: 11. 52
/******************* * Yhdistely Hash-objektin avulla. * *******************/ * Lajittelua ei tarvita; data asiakas_ja_osallisuus_hashilla; if _n_ eq 1 then do; declare hash demohash(dataset: 'asiakaskokonaisuudet'); demohash. define. Key('pankki', 'astun'); demohash. define. Done(); end; set asiakas_perustiedot; if demohash. find() in (0, 160038) then output; run; NOTE: There were n observations read from the data set ASIAKASKOKONAISUUDET_S. There were n observations read from the data set ASIAKAS_PERUSTIEDOT. The data set WORK. ASIAKAS_JA_OSALLISUUS_HASHILLA has n observations and n variables. DATA statement used (Total process time): real time 2: 41. 20 cpu time 1: 09. 68
data demolibr. hyvaksytyt_sopimukset demolibr. alle_12_konttorissa demolibr. ei_maksuja_konttorissa; merge demolibr. liikevaihto_12 kk (in=lv) demolibr. sopimus_tapahtumat (in=st) ; by pankki astun; attrib sarake_55_rm format = commax 17. 2 length = 8; attrib sarake_60_rm format = commax 17. 2 length = 8; if (_n_ eq 1) then do; * Luodaan hash-taulu konttorissa tehdyistä maksuista. ; declare hash hmaksut(dataset: ”nimi_muutettu_sum"); hmaksut. define. Key("pankki", "astun"); hmaksut. define. Data("pankki", "astun", "kappalemaara", "rahamaara"); hmaksut. define. Done();
* Luodaan hash-taulu omista varoista. ; declare hash omatvara(ordered: "a"); omatvara. define. Key("oytun", "oyvol_luokitt 1"); omatvara. define. Data("oytun", "oyvol_luokitt 1", "oyvol_tietotyyppi", "oyvol_rahamaara"); omatvara. define. Done(); do until (eof_toy_vol); set demolibr. toy_volyymit (keep=oytun oyvol_luokitt 1 oyvol_tietotyyppi oyvol_rahamaara) end=eof_toy_vol; if oyvol_tietotyyppi = 'CA' and oyvol_luokitt 1 in('40', '01') and substr(oytun, 7, 4) eq '9000' then do; omatvara. add(); end;
pankki = substr(pankki, 1, 6); astun = astun; rc = hmaksut. find(); select (rc); when (0) do; /* Asiakkaalle löytyi maksutoimeksiantoja. */ if kappalemaara ge 12 then do; /* Haetaan hash-taulusta pankkien omat varat. */ oytun = cats(pankki, '9000'); oyvol_luokitt 1 = '40'; rc = omatvara. find(); select (rc); when (0) do; /* Haku onnistui. */ sarake_55_rm = oyvol_rahamaara; end; when (160038) do; /* Pankille ei löytynyt omia varoja. Luokittelu 40. */ sarake_55_rm =. ; end; otherwise do; put 'VIRHE: Pankin omien varojen haku hash-taulusta epäonnistui. Luokittelukoodi 40. ' pankki= rc= ’. ’; put 'VIRHE: Ajo kaadetaan. '; abort; end;
oyvol_luokitt 1 = '01'; rc = omatvara. find(); select (rc); when (0) do; /* Haku onnistui. */ sarake_60_rm = oyvol_rahamaara; end; when (160038) do; /* Pankille ei löytynyt omia varoja. Luokittelu 01. */ sarake_60_rm =. ; end; otherwise do; put 'VIRHE: Pankin omien varojen haku hash-taulusta epäonnistui. Luokittelukoodi 01. ' pankki= rc=; put 'VIRHE: Ajo kaadetaan. '; abort; end; else do; output demolibr. alle_12_konttorissa; end;
when (160038) do; /* Asiakkaalle ei löytynyt maksutoimeksiantoja. */ output demolibr. ei_maksuja_konttorissa; end; otherwise do; /* Ilmeisesti joku todellinen ongelma. Tehdään virhe. */ put 'VIRHE: Haku maksuliikkeen hash-taulusta epäonnistui. ' rc= '. '; abort; end; run;
Muutamia muita hash-metodeja Replace() - Päivittää avaimen perusteella rivin hash-objektissa. Check() - Onko avaimella riviä hash-objektissa. Ei muuta datan arvoa. Remove() - Poistaa rivin hash-objektista. Output() - Kirjoittaa hash-objektin SAS-tauluksi. Ref() - Tekee haun, Find(), ja jos avaimella ei löydy riviä hash-objektista, lisää rivin hash-objektiin. First(), Last(), Next(), Prev() - Luetaan hash-objektia peräkkäisjärjestyksessä läpi, eteenpäin tai taaksepäin. Hash-metodien referenssikortin saa googlettamalla sas 9 hash object tip sheet.
- Slides: 10