Proc SQL

Wie extrahiert man einen "Substring" aus einer numerischen Variable?

Simon 29/04/2021 3 Aufrufe

Wenn man mit SAS© und der SQL-Prozedur (PROC SQL) beginnt, ist ein häufiger Fehler, numerische Variablen so zu behandeln, als wären sie Zeichenketten.

Ein klassischer Fall ist eine ID- oder Datumsspalte, die im numerischen Format gespeichert ist (zum Beispiel 20190901 für den 1. September 2019). Wenn Sie versuchen, die Funktion SUBSTR zu verwenden, um das Jahr "2019" in einer WHERE-Klausel zu extrahieren, wird SAS© einen Fehler zurückgeben.

Warum? Weil SUBSTR eine Zeichenkette erwartet und keine Zahl. Außerdem führt der Versuch, das Ergebnis (Zeichenkette) mit einer Zahl (2019) zu vergleichen, zu einer Typ-Inkompatibilität.

Hier sind drei Methoden, um dieses Problem zu lösen, von der "mathematischsten" bis zur "Best Practice".

Illustration

1. Die mathematische Methode (Arithmetik)

Wenn Ihre Spalte numerisch ist, ist die leistungsstärkste Lösung oft, im numerischen Bereich zu bleiben. Anstatt zu versuchen, den Text zu schneiden, verwenden Sie die Mathematik.

Stellen wir uns eine Variable date_id vor, die 20190901 enthält. Um die ersten 4 Ziffern (das Jahr) zu erhalten, teilen Sie einfach durch 10.000 und behalten nur den ganzzahligen Teil.

SAS©-Code:

1PROC SQL;
2 select count(receipt_number)
3 from ma_table
4 where floor(date_id / 10000) = 2019;
5QUIT;
Hier ergibt 20190901 / 10000 den Wert 2019.0901. Die FLOOR-Funktion rundet auf die nächste ganze Zahl ab, also 2019.

Wenn Sie einen Teil in der Mitte der Zahl extrahieren müssten, würde die Logik komplexer werden (eine Mischung aus Subtraktionen und Divisionen), was diese Methode für komplexe Extraktionen weniger lesbar macht.

2. Die Konvertierungsmethode (Explizites Typcasting)

Wenn Sie die Variable unbedingt als Text behandeln möchten, müssen Sie sie explizit konvertieren. Es reicht nicht aus, PUT zu verwenden; oft müssen Sie die Leerzeichen verwalten, die bei der Konvertierung eingefügt werden können.

Diese Methode ist jedoch oft umständlicher und anfälliger für Vergleichsfehler (Vergleich einer Zeichenkette '2019' mit der Zahl 2019).

3. Die "Beste Praxis": In ein echtes SAS-Datum konvertieren

Wenn Ihre numerische Variable tatsächlich ein Datum darstellt (wie 20190901), ist die robusteste und sauberste Methode, sie in einen echten SAS©-Datumswert umzuwandeln. Einmal konvertiert, können Sie die leistungsstarken Zeitfunktionen von SAS© (YEAR, MONTH, DAY) verwenden.

Um eine Zahl JJJJMMTT in ein SAS©-Datum umzuwandeln, verwendet man die Kombination aus INPUT und PUT:

  1. PUT(date_id, 8.): Wandelt die Zahl in eine Zeichenkette um.

  2. INPUT(..., yymmdd8.): Liest diese Zeichenkette, um ein gültiges SAS©-Datum zu erstellen.

SAS©-Code:

1PROC SQL;
2 /* Création d'une date temporaire pour le filtre */
3 select count(receipt_number)
4 from ma_table
5 where year(INPUT(put(date_id, 8.), yymmdd8.)) = 2019;
6QUIT;

Vorteile:

  • Lesbarkeit: Man versteht sofort, dass nach dem Jahr gefiltert wird.

  • Flexibilität: Sie können leicht wechseln, um nach dem Monat (MONTH() = 9) oder dem Tag zu filtern, ohne komplexe mathematische Berechnungen erneut durchführen zu müssen.