Stavo lavorando con una query sql SAS proc e ho scoperto qualcosa di strano. In primo luogo, ho provato questo semplice query:Comportamento dispari su Somma (Ottenere overflow numerico)
proc sql;
CREATE TABLE test AS
(SELECT
YEAR(dt) AS yr,
MONTH(dt) AS mo,
SUM(val) AS total
FROM
mydb1234.myTable
WHERE
myDate BETWEEN x AND y
GROUP BY
yr, mo);
run;
Quando eseguo questa query, ricevo questo errore:
ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.
Da quello che posso dire, questo accade quando il mio valore riassunto diventa troppo grande per essere nel tipo di dati che sta cercando di utilizzare proc sql
.
ho deciso che vorrei solo dividere il numero che sto somma:
SUM(val/1000) AS total
Tuttavia, questo ha avuto conseguenze impreviste. Il totale sommato era inferiore a una somma manuale che ho fatto in Excel. Il totale si abbassa man mano che aggiungo altri ordini di grandezza al divisore. Immagino che questo stia eliminando valori più piccoli che cerca di sommare (ad esempio 10/1000 vs 108/10000, ecc.) Che non raggiungono mai la somma e sono invece letti come zero.
C'è un modo per forzare questo sql proc a creare una tabella utilizzando una lunghezza del campo che può contenere i miei valori totali? Sono nell'intervallo di miliardi e miliardi di miliardi, quindi non penso a niente di insolito. Ero curioso di vedere cosa pensavi.
Questo non è un problema specifico SAS, non credo. SAS non ti darà un overflow; a meno che tu non sia in numeri così folli che non potrebbe essere memorizzato in modo impreciso a 64 bit, comunque, il che non è certamente il caso. Se hai generato un numero di> 15 cifre significative, potrebbe iniziare a perdere significato, ma non ti darà alcuna indicazione che lo stia facendo. – Joe
Come funziona l'interfaccia con i teradata? Esiste un 'libname' su un server teradata, o è passato, o qualcos'altro? – Joe
C'è una biblioteca e mi riferimento in questo modo: 'DA mydb1234.myTable' Dove mydb1234 è un' libref' –