App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
[Datenbanken] SQL bzw PL/SQL Quantilberechnung
- Ersteller nightsky99
- Erstellt am
nightsky99
Grand Admiral Special
- Mitglied seit
- 25.11.2001
- Beiträge
- 2.043
- Renomée
- 19
- Standort
- Wuppertal
- Mein Laptop
- Asus AJ7
- Prozessor
- Q8200 @ 3.1 Ghz
- Mainboard
- Asus P5Q
- Kühlung
- Scythe Mugen + Retention
- Speicher
- 4 x 1 GB AData Vitesta 800 xtreme
- Grafikprozessor
- Asus Radeon 5850 @ Accelero S1 Rev. 2
- Display
- HP w2228h
- HDD
- Supertalent Ultradrive 64GB SSD, WD 640GB Eco Green Platte
- Optisches Laufwerk
- LG GSA-H44 blabla
- Soundkarte
- Creative Audigy 2 ZS
- Gehäuse
- Antec P160 -voll verdämned-
- Netzteil
- BeQuiet 400W
- Betriebssystem
- Win7
- Webbrowser
- Feuerfuchs
- Verschiedenes
- Temp: , idle: 40°C , last: 50°C @ 3.1 Ghz @ 1.128V
Grüß euch!
Es geht um ein sehr interessantes Problem: ich habe eine Tabelle in meiner Oracle DB, die aus einer einzigen Spalte besteht und worin ca. 10.000 Messwerte stehen.
Jetzt müsste ich daraus zwei Werte extrahieren:
- den Wert von Q25 (also das erste Quartil)
- den Wert von Q75 (das dritte Quartil).
Zur Erklärung, was die Quartile eigentlich sind: wenn die Werte alle der Größe nach geordnet vorliegen, dann ist das erste Quartil das erste Viertel aller Werte, das zwei ist das zweite Viertel aller Werte usw...als Beispiel: ein Array der Größe 100 mit sortierten Zahlen drin: Q25 wäre dann der Wert, an Position 25 des Arrays....Q75 an Stelle 75 usw.
(Aber Achtung: bei einer Arraygröße von 200 wäre Q25 dann Position 50 etc.).
Bei einem Array ist das Vorgehen für Q75 einfach: Position(Arraylänge * 0.75)
Wie geht man aber bei einer SQL Abfrage in effizienter Weise vor?
(Also nicht alle Werte einzeln auslesen, einen Counter erhöhen, den Counter mit der Länge abgleichen etc.)
Es geht um ein sehr interessantes Problem: ich habe eine Tabelle in meiner Oracle DB, die aus einer einzigen Spalte besteht und worin ca. 10.000 Messwerte stehen.
Jetzt müsste ich daraus zwei Werte extrahieren:
- den Wert von Q25 (also das erste Quartil)
- den Wert von Q75 (das dritte Quartil).
Zur Erklärung, was die Quartile eigentlich sind: wenn die Werte alle der Größe nach geordnet vorliegen, dann ist das erste Quartil das erste Viertel aller Werte, das zwei ist das zweite Viertel aller Werte usw...als Beispiel: ein Array der Größe 100 mit sortierten Zahlen drin: Q25 wäre dann der Wert, an Position 25 des Arrays....Q75 an Stelle 75 usw.
(Aber Achtung: bei einer Arraygröße von 200 wäre Q25 dann Position 50 etc.).
Bei einem Array ist das Vorgehen für Q75 einfach: Position(Arraylänge * 0.75)
Wie geht man aber bei einer SQL Abfrage in effizienter Weise vor?
(Also nicht alle Werte einzeln auslesen, einen Counter erhöhen, den Counter mit der Länge abgleichen etc.)
JKuehl
Grand Admiral Special
- Mitglied seit
- 22.06.2003
- Beiträge
- 7.903
- Renomée
- 145
- Standort
- Stockholm, Schweden
- Mitglied der Planet 3DNow! Kavallerie!
- Aktuelle Projekte
- POEM, SIMAP
- Lieblingsprojekt
- SIMAP, POEM
- Meine Systeme
- Q6600
- BOINC-Statistiken
- Folding@Home-Statistiken
- Prozessor
- Ryzen-3700x
- Mainboard
- Asus B350 Prime Plus
- Kühlung
- Fractal Design Celsius 240
- Speicher
- 48 GB Corsair LPX 3000
- Grafikprozessor
- 1080ti
- Display
- 28" Samsung 3840x2160
- SSD
- Samsung Evo 960 500Gb
- Soundkarte
- Creative X-Fi Titanium PCIe
- Netzteil
- Be Quiet Dark Power 650
- Betriebssystem
- Windows 10 64 Bit
Ich würds entweder über eine stored procedure lösen oder mit order by erstmal die werte aufsteigend sortieren und dann nur noch den wert in gezielt abfragen.
Dürfte in etwa so gehen, das ganze kannst du dann noch schachteln.
1) liefert dir die sortierte Tabelle:
[FONT=Verdana, Arial, Helvetica, sans-serif]SELECT "Spalten_Name"
FROM "Tabellen_Name"
[WHERE "Bedingung"]
ORDER BY "Spalten_Name" ASC
2) liefert die Anzahl der Zeilen der Tabelle, dadurch kannst du dann rausbekommen wo die Zeile 0.75 * count liegt
[/FONT]Select COUNT(Supplier_ID) from suppliers;
Bestimmte Zeile wählen machst du mit Limit - wählt Zeile 23 - da trägst du dann den Wert aus 2) ein
SELECT "Spalten_Name" FROM "Tabellen_Name" LIMIT 23,1
.
EDIT :
.
Alternativ dürfte es wohl auch über RANK gehen.
.
EDIT :
.
Und hier gibts einen fertigen Code (Google mit "SQL quantile")
http://forge.mysql.com/tools/tool.php?id=149
Dürfte in etwa so gehen, das ganze kannst du dann noch schachteln.
1) liefert dir die sortierte Tabelle:
[FONT=Verdana, Arial, Helvetica, sans-serif]SELECT "Spalten_Name"
FROM "Tabellen_Name"
[WHERE "Bedingung"]
ORDER BY "Spalten_Name" ASC
2) liefert die Anzahl der Zeilen der Tabelle, dadurch kannst du dann rausbekommen wo die Zeile 0.75 * count liegt
[/FONT]Select COUNT(Supplier_ID) from suppliers;
Bestimmte Zeile wählen machst du mit Limit - wählt Zeile 23 - da trägst du dann den Wert aus 2) ein
SELECT "Spalten_Name" FROM "Tabellen_Name" LIMIT 23,1
.
EDIT :
.
Alternativ dürfte es wohl auch über RANK gehen.
.
EDIT :
.
Und hier gibts einen fertigen Code (Google mit "SQL quantile")
http://forge.mysql.com/tools/tool.php?id=149
Chris_Bear
Admiral Special
Das dürfte relativ einfach machbar sein:
Die Subquery ist nötig damit rownum die richtigen Zeilen anspricht.
Gruß,
Chris
Edit: @JKuehl: LIMIT ist MySQL, bei Oracle wird das per rownum gemacht
- Per Count(*) herausfinden wieviele Werte in der Tabelle drin stehen. Merk dir den Wert auf einem Zettel oder (falls du den Code mehr als einmal ausführen willst) in einer Variable
- Mit folgender Query (ungetestet, aber sollte in etwa so aussehen) bekommst du dann deine Ergebnisse:
Code:
SELECT Spalte as Q25
FROM (SELECT Spalte FROM Tabelle ORDER BY Spalte ASC)
WHERE rownum=(count*0.25);
Gruß,
Chris
Edit: @JKuehl: LIMIT ist MySQL, bei Oracle wird das per rownum gemacht
nightsky99
Grand Admiral Special
- Mitglied seit
- 25.11.2001
- Beiträge
- 2.043
- Renomée
- 19
- Standort
- Wuppertal
- Mein Laptop
- Asus AJ7
- Prozessor
- Q8200 @ 3.1 Ghz
- Mainboard
- Asus P5Q
- Kühlung
- Scythe Mugen + Retention
- Speicher
- 4 x 1 GB AData Vitesta 800 xtreme
- Grafikprozessor
- Asus Radeon 5850 @ Accelero S1 Rev. 2
- Display
- HP w2228h
- HDD
- Supertalent Ultradrive 64GB SSD, WD 640GB Eco Green Platte
- Optisches Laufwerk
- LG GSA-H44 blabla
- Soundkarte
- Creative Audigy 2 ZS
- Gehäuse
- Antec P160 -voll verdämned-
- Netzteil
- BeQuiet 400W
- Betriebssystem
- Win7
- Webbrowser
- Feuerfuchs
- Verschiedenes
- Temp: , idle: 40°C , last: 50°C @ 3.1 Ghz @ 1.128V
Also echt mal - ich zerbrech mir da zwei Stunden den Kopf drüber und bei euch gehts so schnell Mir hat die Sache mit der ROWNUM gefehlt, daran kann man sich wirkich schön aufhängen.
Habe es jetzt hinbekommen in leicht modifzierter Form wie Chris_Bear mir es vorgeschlagen hat - die Sache mit dem count funktioniert nicht so ganz direkt, dafür muss nochmal die komplette Subquery rein, die dir den Count zurück liefert. Außerdem muss um alles nochmal eine Query, da du den Rownum Wert so nicht abfragen kannst - und schlussendlich braucht man nochmal eine Query, da beim sortieren der Daten, die ROWNUM Werte ebenfalls verändert werden.
Übersetzt sieht das dann so aus:
Vielen Dank euch nochmal! Das gibt ein Bier für euch, wenn ihr mal in der Nähe seid 8)
PS: Ihr habt mich vor einem "User Call exceed CPU limit" bewahrt
Habe es jetzt hinbekommen in leicht modifzierter Form wie Chris_Bear mir es vorgeschlagen hat - die Sache mit dem count funktioniert nicht so ganz direkt, dafür muss nochmal die komplette Subquery rein, die dir den Count zurück liefert. Außerdem muss um alles nochmal eine Query, da du den Rownum Wert so nicht abfragen kannst - und schlussendlich braucht man nochmal eine Query, da beim sortieren der Daten, die ROWNUM Werte ebenfalls verändert werden.
Übersetzt sieht das dann so aus:
Code:
SELECT Q25 FROM(
SELECT tab1.myvalue AS Q25, ROWNUM _r
FROM (SELECT Spalte AS myvalue FROM Tabelle ORDER BY Spalte ASC) tab1)
WHERE r_ = ROUND((SELECT COUNT(*) FROM Tabelle) * 0.25)
Vielen Dank euch nochmal! Das gibt ein Bier für euch, wenn ihr mal in der Nähe seid 8)
PS: Ihr habt mich vor einem "User Call exceed CPU limit" bewahrt
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 134K