Datenbank Ergebnis vergleich gleicher Datensätze

Matayus

Aktiver Benutzer
Beiträge
25
Moin moin in die Runde,

ich habe mal wieder ein Anliegen, da ich leider nicht weiter komme und schon einiges ausprobiert habe. Aber irgendwie komme ich nie zu meinem gewünschten Ergebnis.

Ich sammele Daten per API auf meinem Datenbankserver. Nun möchte ich gerne Auswertungen darüber machen bezüglich der Preise.

ZU den Fakten: Die gesammelten Daten trudeln alle XX Minuten in die Datenbank und werden mit einem Datensatz markiert. Jeder neuer Eintrag bekommt +1. Nun möchte ich genau den neuesten Datensatz miteinander vergleichen und entsprechend ausgeben.

Das ganze sieht in etwa so aus:
upload_2019-10-10_8-50-12.png


Die spalten in gelb sind die neuesten (letzten) Datensätze. "Also Dataset 5".
Die anderen Farben dienen nur zum Verständnis !!

Ich möchte gerne 2 Sachen abfragen innerhalb dieser Datensätze:
1. Ich benötige vom letzten Datensatz einmal den höchsten BID und den niedrigsten ASK Price.
In diesem Fälle wäre das: Rakuten Bid 11,50 und Amazon Ask 13,00

2. Ich benötige vom Last_Price den spread unterschied zwischen dem höchsten Last_Price und dem niedrigsten Last_price. In diesem Falle wäre das:
Amazon mit 12 und Rakuten mit 12,50 und einem spread von 4,16 %

Habe selber schon seit 1 Woche herum gedoktert und auch mit dem over Befehl experimentiert. Aber irgendwie komme ich nie zu meinem gewünschten Ergebnis. Hoffe jemand kann mir diesbezüglich helfen.

Besten Dank, Mata
 
Werbung:
Ob ich die zweite Frage richtig verstanden habe weiß ich nicht ...

Code:
test=*# select * from matayus ;
 markt | bid  | ask  | last | dataset
-------+------+------+------+---------
 a     |   10 |   12 |   11 |       1
 e     | 10.2 | 12.2 | 11.2 |       1
 r     | 10.5 | 12.5 | 11.5 |       1
 a     | 10.5 | 12.5 | 11.5 |       2
 e     | 10.7 | 12.7 | 11.7 |       2
 r     |   11 |   13 |   12 |       2
 a     | 10.5 | 12.5 | 11.5 |       3
 e     | 10.7 | 12.7 | 11.7 |       3
 r     |   11 |   13 |   12 |       3
 a     | 10.5 | 12.5 | 11.5 |       4
 e     | 10.7 | 12.7 | 11.7 |       4
 r     |   11 |   13 |   12 |       4
 a     |   11 |   13 |   12 |       5
 e     | 11.2 | 13.2 | 12.2 |       5
 r     | 11.5 | 13.5 | 12.5 |       5
(15 rows)

test=*# with dataset as (select max(dataset) from matayus ), vals as (select * from matayus,dataset where dataset = dataset.max)  (select markt, 'bid max' as price, bid from vals order by bid desc limit 1) union all (select markt, 'ask min', ask from vals order by ask asc limit 1);
 markt |  price  | bid  
-------+---------+------
 r     | bid max | 11.5
 a     | ask min |   13
(2 rows)

test=*# with x as (select distinct markt, min(last) over (partition by markt), max(last) over (partition by markt) from matayus) select * from x order by markt;
 markt | min  | max  
-------+------+------
 a     |   11 |   12
 e     | 11.2 | 12.2
 r     | 11.5 | 12.5
(3 rows)
 
Hamma wie schnell Du wieder bist Herr Kretschmer... was wäre ich bloß ohne Dich.
Formel 1 ist genau so wie ich es haben möchte. Frage zur ersten Formel: Wo in der Formel hast Du die Abkürzungen für die Märkte hinterlegt ?
Oder hattest Du es manuell zur Übersicht eingefügt ? Weil Du fragst ja eigentlich Markt ab.

Die 2. Formel hab ich mich wohl nicht gut genug ausgedrückt.
Der höchste Last_price soll im Vergleich zum niedrigsten Last_Preis von Dataset 5 überprüft werden.
In meinem Beispiel wäre das Amazon 12,00 und Rakuten 12,50. Ebay soll gar nicht angezeigt sondern nur der höchste und der niedrigste Wert.
Und falls es dazu klappt, den Spread zwischen den höchsten und niedrigsten Last_price von "Dataset5". In diesem Falle "((12,5/12)-1)*100" quasi.


Kommst Du zufällig aus Raum Bremen ?? Würd Dich gern mal zum Bierchen als Dank einladen :)
 
Abkürzung für Märkte? Ich hab einfach, faul wie ich bin, a,e und r genommen, das sind die jeweiligen Anfangsbuchstaben, in klein ;-)

Code:
test=*# with dataset as (select max(dataset) from matayus ), vals as (select * from matayus,dataset where dataset = dataset.max) select max(last), min(last),((max(last)/min(last))-1)*100 as spread from vals;
 max  | min |         spread         
------+-----+------------------------
 12.5 |  12 | 4.16666666666666666700
(1 row)

Woher ich komme steht zufällig in meinem Profil ;-)
 
Du könntest akretschmer auch eine Freude machen, wenn Du einen Upgrade von MySQL nach Postgres machst :rolleyes:
Damit er nicht so alleine ist mit der Hilfe ?? :P
Bin leider nur etwas fit in VB Script und lerne grade C im Studium :)

Perfekt akretschmer. Formel 2 passt genau so zu 100% !!

Dresden ist leider doch ne Strecke…. sollte es Dich mal nach Bremen verschlagen kannst Dich liebend gerne bei mir melden :)
Mega vielen Dank mal wieder.
 
Moin Andreas,

endlich steht meine Datenbank und diese wird nun auch mit Daten gefüttert.
Habe die Formeln ausprobiert und habe einen Fehler. Hoffe Du kannst mir da nochmal unter die Arme greifen :)

Beispiel 2. Formel von Dir:

upload_2019-10-16_11-31-16.png
Mysql meckert mir den Komma an aber ich weiss nicht warum.
Hier die Fehlermeldung vom Compiler:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' vals as (select * from ticker,dataset where dataset = dataset.max) select max' at line 1

Beste Grüße, Mata
 
da fehlt was am Anfang, die Abfrage fängt mit WITH an. Ja, das gehört dazu. Ich bin mir aber nicht sicher, ob MySQL das überhaupt kann.

Grüße aus Mailand.
 
Werbung:
Zurück
Oben