2012-04-24 4 views
5

Gibt es eine Möglichkeit, mehrere Daten in Oracle zu mitteln? avg tut nicht gut.Mittelung von Daten in Oracle sql

Danke.

+2

Was ist ein "durchschnittliches" Datum? Ich denke, Sie müssen genauer darüber sein, was Sie zu tun versuchen. –

Antwort

14

Die Definition eines "durchschnittlichen Datums" ist subjektiv, aber Sie könnten Ihre Daten in eine julianische Zahl umwandeln, diese dann mitteln, abrunden und dann in ein Datum zurückkonvertieren.

create table dates (dt DATE); 

insert into dates 
values ('24-APR-2012'); 
insert into dates 
values ('01-JAN-2012'); 
insert into dates 
values ('01-JAN-2013'); 
insert into dates 
values ('25-DEC-1900'); 


select to_date(round(avg(to_number(to_char(dt, 'J')))),'J') 
from dates; 

Hier ist die SQL Fiddle: http://sqlfiddle.com/#!4/98ce9/1

+0

vielen Dank. schätze die Hilfe. – user1261700

1

Oracle übernimmt einen Teil Datumsberechnungen natürlich - zB TRUNC (SYSDATE) + 1 wird das morgige Datum zurück.

So ein anderer Ansatz ist Ihr Datum zu einer Konstante vergleichen: in Tagen zu einer Konstante (zB SYSDATE)

2) Durchschnitt und dann rund

1) vergleichen Abstand, dass die Berechnung

3) vergleichen Sie den Durchschnitt zurück zu SYSDATE & konvertieren zurück auf das Datum.

Hier einige Code ist, das dies tut (ersetzen dt mit dem, was Feld hat Ihre Daten)

TO_DATE(
    TRUNC(SYSDATE) - ROUND(AVG(TRUNC(SYSDATE) - TRUNC(dt))) 
) 

Auf einigen Beispieldaten dies in knapp der Hälfte der Zeit der Annäherung Dan A. die oben lief, und produzierte die gleiche Ausgabe. Nur getestet es gegen Daten mit Daten in der Vergangenheit, aber ich sehe keinen offensichtlichen Grund, dass es nicht verallgemeinern würde (berühmte letzte Worte im Umgang mit DATETIME Daten, realisiere ich ...)

+0

Ja, das sieht effizienter aus als meine Lösung. Sie haben kleinere "Distanzen" zum Berechnen und Mitteln. –

5

Der 'Median' Funktion in Orakel in einer ordentlichen Art und Weise tut genau was andere Antworten tun. Hier

ist ein Link auf die Oracle-Dokumentation - https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions086.htm

es als arg einen numerischen Datentyp nehmen oder ein nicht-numerischen Datentyps, der implizit in eine Zahl umgewandelt werden kann.

SQL> desc x1 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
A           NOT NULL NUMBER 
D             DATE 

SQL> select * from x1; 

    A D 
---------- --------- 
    1 11-DEC-14 
    2 13-DEC-14 
    3 22-DEC-14 
    4 02-DEC-14 
SQL> select median(d) from x1; 

MEDIAN(D) 
--------- 
12-DEC-14 
0

SYSDATE + AVG(dt - SYSDATE)

Keine Notwendigkeit, ein Datum zu einem Datum zu konvertieren. Schneiden Sie den gesamten Ausdruck ab, wenn die Zeit nicht in result enthalten sein soll. Kürzen Sie die Datumsspalte (dt), wenn Sie nicht möchten, dass Zeiten bei der Berechnung des Durchschnitts verwendet werden. MEDIAN ist nicht dasselbe wie AVG.