Tomemos este ejemplo usando la tabla sashelp.baseball. Queremos contar el número total de elementos y calcular una suma basada en una condición compleja (donde la diferencia absoluta entre los hits y las carreras es inferior al 10% de los turnos al bate).
En este código, la expresión abs( nhits - nruns ) < 0.1*natbat devuelve implícitamente 1 o 0, lo que permite que la función SUM funcione directamente.
La Solución: Usar CASE en PROC FedSQL
Cuando pasamos a PROC FedSQL para ejecutar este código de forma distribuida en CAS, esta conversión implícita de booleano a entero no es compatible de la misma manera con el estándar ANSI más estricto. Si intenta ejecutar el código tal cual, fallará o no producirá el resultado esperado.
Para emular este comportamiento, debemos hacer la lógica explícita usando una instrucción CASE.
proc fedsql sessref=casauto;
create table BenchMark as
select count(*) as ItemCount
, sum(case
when (abs (nhits - nruns ) < (0.1*natbat)) is true then 1
end
) as DIFF_10
from baseball;
quit;
1
PROC FEDSQL sessref=casauto;
2
create TABLE BenchMark as
3
select count(*) as ItemCount
4
, sum(case
5
when (abs (nhits - nruns ) < (0.1*natbat)) is true THEN1
6
END
7
) as DIFF_10
8
from baseball;
9
QUIT;
Análisis de los cambios
Instrucción CASE: Hemos encapsulado la condición en una estructura CASE ... WHEN ... THEN ... END.
Explicitación: La cláusula WHEN ... IS TRUE THEN 1 obliga al motor a devolver el valor numérico 1 cuando se cumple la condición. Si la condición es falsa, el CASE devuelve implícitamente NULL (o se podría añadir un ELSE 0), que es ignorado por la función SUM, reproduciendo así el comportamiento del PROC SQL original.
Ejecución CAS: Gracias a la opción sessref=casauto (o el nombre de su sesión CAS), este código ahora se ejecuta con la potencia del cálculo distribuido.
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.