Wie Runde durchschnittlich 2 Dezimalstellen in PostgreSQL?
Ich bin mit PostgreSQL über das Ruby gem 'Fortsetzung'.
Ich versuche, Runde auf zwei Dezimalstellen.
Hier ist mein code:
SELECT ROUND(AVG(some_column),2)
FROM table
Bekomme ich die folgende Fehlermeldung:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Bekomme ich keine Fehlermeldung, wenn ich den folgenden code ausführen:
SELECT ROUND(AVG(some_column))
FROM table
Weiß jemand, was ich falsch mache?
Deine Fehlermeldung entspricht nicht dem code in deiner Frage.
Der syntax-Fehler abgesehen, eng Verwandte Frage auf dba.SE wirft ein Licht auf Rundung double-precision-zahlen in PostgreSQL.
Vielen Dank für den Hinweis. Es sollte sagen, 'rund', wo es heißt 'avg'. Bearbeitet.
Der syntax-Fehler abgesehen, eng Verwandte Frage auf dba.SE wirft ein Licht auf Rundung double-precision-zahlen in PostgreSQL.
Vielen Dank für den Hinweis. Es sollte sagen, 'rund', wo es heißt 'avg'. Bearbeitet.
InformationsquelleAutor user1626730 | 2012-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
PostgreSQL nicht definieren
round(double precision, integer)
. Aus Gründen @Pfiffe erklärt in den Kommentaren, die version von der Runde, die dauert einer Genauigkeit ist nur fürnumeric
.(In den oben genannten, beachten Sie, dass
float8
ist nur ein Kürzel fürdouble precision
. Sie können sehen, dass PostgreSQL baut es in der Ausgabe).Müssen Sie casten den Wert auf gerundet werden zur
numeric
verwenden Sie die zwei-argument-formround
. Fügen Sie einfach::numeric
für die Abkürzung cast, wieround(val::numeric,2)
.Wenn Sie die Formatierung für die Anzeige an den Benutzer, verwenden Sie nicht
round
. Verwendento_char
(siehe: Datentyp-Formatierungsfunktionen in der Anleitung), können Sie angeben, ein format und bietet Ihnen einetext
Ergebnis, das nicht betroffen, was Skurrilität Ihrer client-Sprache tun könnten, mitnumeric
Werte. Zum Beispiel:to_char
Runden zahlen, die für Sie als Teil der Formatierung. DieFM
Präfix erzähltto_char
dass Sie nicht möchten, dass das Auffüllen mit führenden Leerzeichen.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, bekomme ich die Meldung '0.314E1'. Und ich habe meinen code wie folgt geschriebenROUND(AVG(val),2)
aber bekomme immer noch die Fehler habe ich beschrieben in meiner Frage.Ich lief einfach
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
auf PgAdmin und Ruby. Mit PgAdmin, ich bekomme 3.14, aber mit Ruby (mit er Nachfolger gem) bekomme ich die Meldung '0.314E1'. Ich Frage mich, warum das so ist..."Für einige ungerade Grund, warum die version der Runde, nimmt einen precision nur für numerische." Floating-point-zahlen sind "nützliche Näherungen". Wenn Sie Fragen, code um eine Fließkommazahl auf zwei Dezimalstellen gibt andere floating-point-Zahl, es gibt keine Garantie, dass die nächste Annäherung an die "richtige" Antwort wird nur zwei Ziffern rechts von der Dezimalstelle. Numerik effektiv skalierte Ganzzahlen; Sie haben dieses problem nicht.
Guter Punkt - ein
double
version vonround
würde zurückkehren müssennumeric
oder (igitt)text
, so könnte es genauso gut einnumeric
argument.Für diejenigen, die versuchen zu finden den Kommentar von @Pfiffe : es ist jetzt Mike Sherrill 'Katze Recall"
InformationsquelleAutor Craig Ringer
Versuchen Sie auch die alte syntax für Gießen,
funktioniert mit jeder version von PostgreSQL.
Es gibt einen Mangel an überlastungen in einigen PostgreSQL-Funktionen, warum (???): Ich denke, "es ist ein Mangel" (!), aber @CraigRinger, @Pfiffe und das PostgreSQL-team sind sich einig über die "pg' s historische Gründe".
PS: ein weiterer Punkt zu Runden ist Genauigkeit, überprüfen @IanKenney Antwort.
Überladen als casting-Strategie
Können Sie überlastung die ROUND-Funktion mit,
Nun deine Anleitung funktioniert, versuchen Sie (nach Erstellung einer Funktion)
aber es gibt einen NUMERISCHEN Typ... Zu bewahren, die erste common usage überlastung, die wir zurückkehren können, einen FLOAT-Typ, wenn Sie einen TEXT-parameter angeboten wird,
Versuchen
PS: überprüfen
\df round
nach überbeanspruchungen kommen, wird sich zeigen etwas wie,Den
pg_catalog
Funktionen sind die Standardwerte, siehe Handbuch der eingebaute mathematische Funktionen.InformationsquelleAutor Peter Krauss
Versuchen Sie es mit diesem:
Oder einfach:
warum ist es so schwer, um Dinge zu tun, die in postgres?
InformationsquelleAutor atiruz
Laut Bryan ' s Antwort, die Sie dies tun können, zu begrenzen Dezimalstellen in einer Abfrage. Ich konvertieren von km/h zu m/s und zeigen Sie es in der dygraphs aber wenn ich habe es in dygraphs es sah seltsam. Sieht gut aus wenn dabei die Berechnung in der Abfrage statt. Dies ist auf postgresql 9.5.1.
InformationsquelleAutor kometen
Lösung: Sie müssen addtype geworfen, dann wird es funktionieren
Ex:
round(extract(second from job_end_time_t)::integer,0)
InformationsquelleAutor user5702982